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