C++ 静态_cast的奇怪用法

C++ 静态_cast的奇怪用法,c++,null,zero,static-cast,C++,Null,Zero,Static Cast,在我们的生产环境中,我遇到了以下代码构造(但是经过了大量简化) #包括 类型定义结构 { 字符输入[10]; } 斯图斯特酒店; 类型定义结构 { 酒店结构目录; } 外部结构; 结构测试 { 静态常数int ENTRY_LENGTH=(sizeof((static_cast(0))->directory.ENTRY) /sizeof((static_cast(0))->directory.entry[0]); }; int main() { 试验a; std::cout是的,此代码完

在我们的生产环境中,我遇到了以下代码构造(但是经过了大量简化)

#包括
类型定义结构
{
字符输入[10];
}
斯图斯特酒店;
类型定义结构
{    
酒店结构目录;
} 
外部结构;
结构测试
{
静态常数int
ENTRY_LENGTH=(sizeof((static_cast(0))->directory.ENTRY)
/sizeof((static_cast(0))->directory.entry[0]);
};
int main()
{
试验a;

std::cout是的,此代码完全可以接受。请参见§5.3.3/1(重点)

sizeof运算符在其操作数的对象表示形式中产生字节数。操作数可以是一个表达式,它是一个未赋值的操作数(第5条),也可以是一个parantesized type-id

表达式没有求值,因此看起来对空指针的解引用没有问题

还要注意的是,在C++11中,您不需要跳过该环,只需使用sizeof直接引用类成员,这要归功于§5/8(我的重点):

在某些上下文中,会出现未计算的操作数(5.2.8、5.3.3、5.3.7、7.1.6.2)。未计算的操作数不会被计算。未计算的操作数被视为完整表达式。[注意:在未计算的操作数中,非静态类成员可能被命名为(5.1)对象或功能的命名本身并不要求提供定义(3.2)。-结束注释]

和§5.1.1/13:

表示类的非静态数据成员或非静态成员函数的id表达式只能用于:

  • 如果该id表达式表示非静态数据成员,并且它出现在未计算的上下文中[示例:

-[结束示例]


是的,此代码完全可以接受。请参见§5.3.3/1(重点)

sizeof运算符在其操作数的对象表示形式中产生字节数。操作数可以是一个表达式,它是一个未赋值的操作数(第5条),也可以是一个parantesized type-id

表达式没有求值,因此看起来对空指针的解引用没有问题

还要注意的是,在C++11中,您不需要跳过该环,只需使用sizeof直接引用类成员,这要归功于§5/8(我的重点):

在某些上下文中,会出现未计算的操作数(5.2.8、5.3.3、5.3.7、7.1.6.2)。未计算的操作数不会被计算。未计算的操作数被视为完整表达式。[注意:在未计算的操作数中,非静态类成员可能被命名为(5.1)对象或功能的命名本身并不要求提供定义(3.2)。-结束注释]

和§5.1.1/13:

表示类的非静态数据成员或非静态成员函数的id表达式只能用于:

  • 如果该id表达式表示非静态数据成员,并且它出现在未计算的上下文中[示例:

-[结束示例]


关于更好形式的两个注释(x::It:Advices):1。它在Clang和GCC中都是有效的,但是在Visual C++ 2013. 2中不适用。在[5.1.1 ]的末尾有一个更好的引用,其中还有一个例子。波格丹补充说,该段也不是第一次读到那么远。格式化也很烦人:-/关于更好形式的两个注释。(X::Enter):1。它在Clang和GCC中都是有效的,但是在Visual C++ 2013. 2中不起作用。在[5.1]的末尾有一个更好的引用,其中还有一个例子。波格丹补充说,该段也没有第一次读到那么远。格式化也很烦人:
#include <iostream>

typedef struct 
{
    char entry[10]; 
}
inn_struct;

typedef struct 
{    
    inn_struct directory;
} 
out_struct;


struct test
{
    static const int 
       ENTRY_LENGTH = (sizeof((static_cast<out_struct*>(0))->directory.entry) 
           / sizeof((static_cast<out_struct*>(0))->directory.entry[0]));
};

int main()
{
    test a;
    std::cout << test::ENTRY_LENGTH;
}
    struct S {
      int m;
    };

    int i = sizeof(S::m); // OK
    int j = sizeof(S::m + 42); // OK