// { dg-options "-std=gnu++11" } // { dg-do compile } // Copyright (C) 2012-2015 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // Taken from N3436: #include #include struct eat { template eat(T const &) {} }; struct not_incrementable {}; struct inc { template auto operator()(T t) const -> decltype(t++) { return t++; } }; template typename std::result_of::type // sfinae here try_inc(A a) { return inc()(a); } not_incrementable try_inc(eat) { return not_incrementable(); } template struct never { static const bool value = false; }; template struct Fail { static_assert(never::value, "duh"); typedef int type; }; struct Fun { template typename Fail::type operator()(T) { return 0; } }; template typename std::result_of::type foo(T) { return 0; } template int foo(...) { return 0; } void result_of_sfinae() { int x = try_inc(1); // OK not_incrementable y = try_inc(std::string("foo")); // OK, not_incrementable (void) x; (void) y; }