std::result_of в std::bind не компилируется в clang++ 3.4

Следующий код компилируется с использованием 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++.


person user2590425    schedule 24.03.2014    source источник
comment
Похоже, что результат std::bind не может быть скопирован при компиляции с clang, поскольку следующее исправление кода делает его компилируемым как с g++, так и с clang++: typename std::result_of‹A( decltype(std::move(std ::bind(f, a))))›::type   -  person Argenet    schedule 24.03.2014
comment
Ну, мое предположение о том, что это невозможно скопировать, было отвергнуто простым тестом. std::cout ‹‹ std::boolalpha ‹‹ std::is_copy_constructible‹decltype(std::bind(f, std::declval‹A›()))››::value ‹‹ std::endl; // выводит true как с GCC, так и с Clang   -  person Argenet    schedule 24.03.2014
comment
@ user2590425 Вы не копируете объект bind в тело g. Вы только инициализируете переменную auto, которая, скорее всего, не копируется. Мне эта ошибка непонятна, см. здесь: объект является подвижным, если f и все аргументы подвижны, и копируемым в противном случае. Обе версии отлично компилируются в GCC 4.8.1 и clang 3.3.   -  person iavr    schedule 24.03.2014


Ответы (1)


result_of был до decltype, вы должны упростить синтаксис следующим образом:

auto g(A a) -> decltype( std::declval<A>()( std::bind(f, a) ) )
person galop1n    schedule 24.03.2014
comment
Это прекрасно работает. Тем не менее, мой вариант тоже должен работать. Кроме того, result_of иногда более полезен, чем decltype, потому что вам не нужно вводить declvals. - person user2590425; 25.03.2014