类中任何一点都知道的类的成员

时间:2014-08-26 18:23:16

标签: c++

我一直认为,如果我在类中声明一个类的成员,那么该成员在类的整个范围内都是已知的:

 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

谢谢。

3 个答案:

答案 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 ++编译器并没有展望未来。