Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态常量成员初始化中的sizeof_C++_Visual Studio 2013_Visual Studio 2005_Sizeof_Member Variables_C++11 - Fatal编程技术网

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)