我一直认为,如果我在类中声明一个类的成员,那么该成员在类的整个范围内都是已知的:
class X
{
public:
X(int a) :v_(a)
{}
private:
int v_;//even though v_ is declared here I'm using it in ctor which is above this line
};
这对我来说很有意义。
无论如何这不是因为我收到v_
未知的错误
class X
{
public:
X(decltype(v_) a) :v_(a)//error on this line, compiler doesn't know v_
{}
private:
int v_;
};
很高兴知道原因。
我正在使用intel编译器v14 SP1
谢谢。
答案 0 :(得分:6)
3.3.7课程范围
1 以下规则描述了在类中声明的名称范围。
1)在类中声明的名称的潜在范围不仅包括以下声明性区域 名称的声明点,也是所有函数体,非静态的括号或等于初始化器 数据成员和该类中的默认参数(包括嵌套类中的这些内容)。
...
这意味着您可以在函数体,构造函数初始化列表和默认参数中使用v_
。您不能像在代码中一样使用参数声明中的v_
。
例如,这应该编译
class X
{
public:
X(int a = decltype(v_)()) : v_(a)
{}
private:
int v_;
};
但不是原帖中的第二个例子。
答案 1 :(得分:1)
您的代码与Clang编译。
阅读C ++ 11规范,在将变量用作函数/构造函数参数后,不允许声明该变量。
答案 2 :(得分:-1)
在许多情况下,包含函数签名的类将在头文件中定义,但在cpp文件中定义函数体。由于编译器在读取cpp文件时已经读取了标头,因此通常不会发生此问题。但事实上,C ++编译器并没有展望未来。