fir*_*ush 4 c++ pointers memory-address constexpr c++11
我有一个变量,其地址作为第四个参数传递给setsocketopt。请注意,此参数被声明为常量指针 ( const void *optval)。
在我提交供审查的补丁中,我将该变量的声明更改为 static constexpr。此更改的审阅者对此表示担忧:他认为是否始终可以获取 constexpr 的地址是值得怀疑的。他建议我将其设为常量。在谷歌搜索后,我找不到太多关于 constexpr 变量地址的信息以及对此的担忧。有人可以解释一下与 constexpr 变量的地址有关的保证以及使用它的注意事项(如果有)吗?
如果它有帮助,这里是代码(我添加的static constexpr,这只是int之前的代码):
static constexpr int ONE = 1;
setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &ONE, sizeof(ONE));
Run Code Online (Sandbox Code Playgroud)
谢谢!
每个对象都保证有一个每个[intro.object]/8的地址
一个对象具有非零大小,如果
不是潜在重叠的子对象,或者
不属于类类型,或者
属于具有虚拟成员函数或虚拟基类的类类型,或者
具有非零大小的子对象或非零长度的位字段。
否则,如果该对象是没有非静态数据成员的标准布局类类型的基类子对象,则它的大小为零。否则,对象大小为零的情况是由实现定义的。除非它是位字段,否则大小非零的对象应占用一个或多个存储字节,包括其任何子对象全部或部分占用的每个字节。普通可复制或标准布局类型([basic.types])的对象应占用连续的存储字节。
强调我的
由于ONE是非类非位字段类型,因此它位于存储中,您可以获取其地址。