我很好奇为什么在这种情况下成员声明的顺序是一个问题:
class A
{
public:
A(decltype(b_) b)
: b_{b}
{}
private:
std::function<void(int, std::string, float)> b_;
};
// error: ‘b_’ was not declared in this scope
虽然只是更改声明顺序有效:
class A
{
std::function<void(int, std::string, float)> b_;
public:
A(decltype(b_) b)
: b_{b}
{}
};
由于 gcc 和 Clang 都以相同的方式处理它,我会说这不是一个错误,但我仍然觉得它令人困惑。
这与完成的类上下文有关。一个班级被认为是完成的,只有在:
函数体([dcl.fct.def.general]),
默认参数,
noexcept 说明符,或
默认成员初始值设定项
并且成员函数的参数列表不是其中的一部分。这意味着您使用的任何类型都需要被编译器知道(看到)。在
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_
已经看过了,所以以后在课堂上使用它没有错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句