C++ 静态常量成员初始化中的sizeof
我有这样的代码:C++ 静态常量成员初始化中的sizeof,c++,visual-studio-2013,visual-studio-2005,sizeof,member-variables,c++11,C++,Visual Studio 2013,Visual Studio 2005,Sizeof,Member Variables,C++11,我有这样的代码: class A { public: unsigned long a; static const unsigned long b = sizeof(a); // "error C2327: 'A::a' : is not a type name, static, or enumerator" in VC++ }; 我在VC++中得到了编译器错误,在IAR中没有错误。 哪一个编译器是正确的,关于C++的标准是什么?你有什么? 您拥有名为a的类的定义 您的类有一个
class A
{
public:
unsigned long a;
static const unsigned long b = sizeof(a); // "error C2327: 'A::a' : is not a type name, static, or enumerator" in VC++
};
我在VC++中得到了编译器错误,在IAR中没有错误。
哪一个编译器是正确的,关于C++的标准是什么?你有什么?
您拥有名为a
的类的定义
您的类有一个名为a
的unsigned long
您的类具有名为b
的a静态常量unsigned long
<>在某些C++编译器中,<强>静态和非static >“<代码>类< /C> >的成员不能混合,特别是在定义阶段。
你想要什么?
这并不是您想要的,但这正是智能编译器试图解决的问题
为什么?
因为静态成员的作用域不限于对象定义。它们跨越了对象范围,可以从任何地方访问,只需使用std::cout在控制台中输出A::b
,您的MSVS版本非常旧,因此基于此,假设它们默认为C++03,则拒绝您的代码是正确的。我将引用,就我们的目的而言,它非常接近C++03标准
9.4[类静态](强调我的)
如果在静态文件的定义中使用了非限定id(5.1)
成员声明符id后面的成员,以及名称查找(3.4.1)
发现非限定id引用了静态成员、枚举器、,
或成员类的嵌套类型(或
成员的类),将非限定id转换为限定id
嵌套名称说明符命名类作用域的表达式
从中引用成员静态成员的定义
不得直接使用其非静态成员的名称
类或其类的基类(包括作为
sizeof运算符)。静态成员的定义只能参考
这些成员构成指向成员(5.3.1)或类的指针
成员访问语法(5.2.5)。
指定此操作不起作用的原因。也就是说,因为它直到
就其不完全符合而言。但是我已经验证了这段代码可以解决这个缺陷:
static const unsigned long b = sizeof(decltype(a))
如果您还想要一些有用的东西,请考虑将<代码> b>代码>一个全局的,而不是一个静态的<代码> > < <代码>:
const unsigned long b = sizeof(A().a)
<代码>静态<代码> >代码> const <代码>:在非C++代码>静态< /代码>类初始化器中的合格成员不是C++标准的一部分,直到C++ 11。< /P>
最早完全支持C++11的MSVC编译器是MSVC2017
该编译器将正确编译您的代码。您使用的是哪个MSVC版本?MSVS 2013和MSVS 2005。我想这意味着您使用的是最新版本的IAR。。。对VS2005。。。不是最新的。关键字是should。我不确定C++11是MSVC2013的默认标准。据我所知,C++11即使在MSVC2015中也不完全受支持。@AlgirdasPreidžius你没有错。。。甚至VS2015也有一些突出的C++11缺陷。或者我应该说C++标准的不足之处:(我会改写清楚的。我试图交流的是<代码> sieof(a)
现在实际上是有效的代码…只是Visual Studio的一个差异阻止了它的编译。@StoryTeller是的,我已经澄清了。正如已经指出的那样,VS2013甚至没有声称符合C++11。这个答案确实提供了一些间接证据,证明了哪些行为是正确的。因此,我对有人投了反对票感到遗憾d在这里,特别是在这个答案中投入了这样的努力。所以有一个+1。我不觉得向下投票有什么不好。我感觉很好,有人能够阅读并理解它,即使他们向下投票或向上投票。标准不是真实的世界,但编译器是真实的。我相信这是正确的(尽管我没有VS2015检查)我只是想不出微软给这部分规范赋予的功能名称,所以在获得支持的时间线上我找不到任何权威性的东西……所以我真的很想了解一下限制……如果你能提供一个链接来获取你的声明,那对你来说值得+1!@JonathanMee:非正式地说,你可以在编译器上勾选_cplusplus的值:MSVC2017是最早将此值设置为C++11值的编译器。在整数运算中可能只值1/2;-)
static const unsigned long b = sizeof(decltype(a))
const unsigned long b = sizeof(A().a)