Следующий код компилируется с использованием g++-4.8, но не с использованием clang 3.4.
#include <type_traits>
#include <functional>
struct A {
template <typename Continuation>
bool operator()(
//const Continuation & continuation
Continuation continuation
) const {
return true;
}
};
bool f(A) {
return true;
}
auto g(A a) ->
typename std::result_of<A(
decltype(std::bind(f, a)))>::type
{
auto continuation = std::bind(f, a);
return a(continuation);
}
int main(int argc, char ** argv) {
A a;
g(a);
}
g++-4.8 -std=c++0x test.cpp # ОК
clang++ -std=С++0x test.cpp
test.cpp:22:38: error: no type named 'type' in 'std::result_of<A (std::_Bind<bool (*(A))(A)>)>'
decltype(std::bind(f, a)))>::type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
1 error generated.
Когда вы раскомментируете закомментированную строку и прокомментируете следующую, код компилируется как на clang, так и на g++.
bind
в телоg
. Вы только инициализируете переменнуюauto
, которая, скорее всего, не копируется. Мне эта ошибка непонятна, см. здесь: объект является подвижным, если f и все аргументы подвижны, и копируемым в противном случае. Обе версии отлично компилируются в GCC 4.8.1 и clang 3.3. - person iavr   schedule 24.03.2014