表达式是'decltype(MyTag :: non_static_m.test + 1)'语法上有效吗?

时间:2014-04-21 05:59:08

标签: c++ c++11 decltype

问题是评论的行'在下面的代码中:

struct MemberType
{
    int test;
};

struct MyTag
{
    MemberType non_static_m;// Note that it's NOT defined with 'static'.
};

int main(void)
{
    typedef decltype(MyTag::non_static_m) TestType_Good;// Well-formed in C++11.
    typedef decltype(MyTag::non_static_m.test) TestType_1;// Is it right or wrong?
    typedef decltype(MyTag::non_static_m.test + 1) TestType_2;// Is it right or wrong?

    return 0;
}

请注意,' MyTag'中的成员是一个非静态字段。 如果列出ISO标准文件中的相关条款,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是有效的。在未评估的操作数(decltype,sizeof等)中,您可以在任意子表达式中为没有对象表达式的非静态数据名称命名。请注意,这不适用于非静态成员函数,而只适用于数据成员。

答案 1 :(得分:1)

您可以对任何有效的C ++表达式使用 decltype ,因此您的3个语句是正确的(它与静态或非静态修饰符无关)。

标准的第7.1.6.2节说

  

由decltype(e)表示的类型定义如下:

  • 如果e是未加密码的id-expression或未加括号的类成员访问(5.2.5),则decltype(e) 是由e命名的实体的类型。如果没有这样的实体,或者e命名了一组重载函数,那么该程序就是格式不正确的;
  • 否则,如果e是x值,则decltype(e)是T&& ,其中T是e的类型;
  • 否则,如果e是左值,则decltype(e)是T& ,其中T是e的类型;
  • 否则,decltype(e)是e的类型。

有关标准参考,请参阅stroustrup FAQ here