C++ 是表达式';decltype(MyTag::非静态m.test+;1)';语法有效吗?

C++ 是表达式';decltype(MyTag::非静态m.test+;1)';语法有效吗?,c++,c++11,decltype,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. type

问题是下面代码中的注释行:

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标准文档中的相关条款被列出,我将非常感激。

< P>您可以在任何有效的C++表达式中使用<强> DECKEXT/SUB>,因此您的3个语句是正确的(与静态或非静态修饰符无关)。 本标准第7.1.6.2节规定:

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

  • 如果e是未授权id表达式或未授权类成员访问(5.2.5),则decltype(e) 是由e命名的实体的类型。如果没有这样的实体,或者如果e命名了一组重载函数,则程序的格式不正确
  • 否则,如果e是xvalue,decltype(e)是T&&,其中T是e的类型
  • 否则,如果e是左值,decltype(e)是T&,其中T是e的类型
  • 否则,decltype(e)就是e的类型

有关标准参考,请参见

这是有效的。在未计算的操作数(decltype、sizeof等)中,可以在任意子表达式中命名非静态数据成员,而不使用对象表达式。请注意,这不适用于非静态成员函数,而仅适用于数据成员。

所有都是正确的。良好的语法或错误,取决于情况和其他选择。问题中的表达式通常不是有效的C++表达式,如果没有定义成员的类类型的实例,则不能访问非静态数据成员。有一个特殊的例外,使得它在未评估的情况下是可以的,所以你的结论是正确的,但是你的回答没有抓住为什么你的结论是正确的这一点。我仍然在阅读链接提供的两个pdf文档。我一会儿回来@hvd:事实上,在发布这个问题之前,我已经阅读了7.1.6.2和其他一些关于decltype的条款,因为我发现似乎没有足够的理由让源代码中编写的表达式只根据这些条款进行编译。@unituniverse这是因为它不直接在7.1.6.2中:)7.1.6.2说“decltype说明符的操作数是未赋值的操作数(第5条)。”第5条(特别是5.1.1p12)表示允许在未赋值的操作数中使用它。这不是
decltype
的特殊例外,但在例如
sizeof
中也允许使用它。