Это связано с контекстом завершенного класса . Класс считается завершенным, только в:
и список параметров функции-члена не является частью этого. Это означает, что любой используемый вами тип должен быть уже известен (замечен) компилятором. В
class A
{
public:
A(decltype(b_) b) <- class not complete here
: b_{b} <- class is complete here since the mem-initializer list is part of [dcl.fct.def.general]
{} <-/
private:
std::function<void(int, std::string, float)> b_;
};
b_
еще не было замечено, поэтому вы получаете ошибку компилятора. С
class A
{
std::function<void(int, std::string, float)> b_;
public:
A(decltype(b_) b)
: b_{b}
{}
};
b_
было замечено, поэтому нет ошибок при использовании его позже в классе.