2016-12-28 18 views
4

Представьте меня есть тип:Почему в этой ситуации не работает std :: function?

struct my_type 
{ 
    double operator()(int a) 
    { 
     return 3.1415; 
    } 
}; 

Тогда я хотел бы, чтобы обернуть его в std::function. Рассмотрим два различных подхода:

my_type m_t; 
std::function<double(int)> f(std::move(m_t)); 
std::cout << f(4) << std::endl; 

Все работает хорошо, как я ожидал, первые цифры PI печатаются. Тогда второй подход:

std::function<double(int)> ff(my_type()); 
std::cout << ff(4) << std::endl; 

Мне кажется, что этот код абсолютно же, как и первый. rvalue передается в качестве аргумента для обертки function. Но проблема в том, что второй код не компилируется! Я действительно не знаю, почему так.

ответ

10

Это знаменитый вопрос most vexing parse. Для std::function<double(int)> ff(my_type()); вы не объявляете объект типа std::function<double(int)>, как и ожидалось, но функцию с именем ff, которая возвращает объект типа std::function<double(int)> и имеет один (неназванный) параметр, который является указателем на функцию, возвращающую тип my_type, и не принимает вход.

Чтобы устранить проблему, вы можете добавить дополнительные скобки или использовать фигурные скобки, которые поддерживались с C++ 11 (скобки могут использоваться для устранения неоднозначности, потому что они не могут использоваться для списка параметров). например

std::function<double(int)> ff1((my_type())); 
std::function<double(int)> ff2(my_type{}); 
std::function<double(int)> ff3{my_type()}; 
std::function<double(int)> ff4{my_type{}}; 

LIVE

 Смежные вопросы

  • Нет связанных вопросов^_^