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

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标准文件中的相关条款,我将不胜感激。

===============>>#1 票数:3 已采纳

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

===============>>#2 票数: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常见问题解答

  ask by unituniverse translate from so

未解决问题?本站智能推荐: