Visual Studio 2013中无法用sizeof(成员变量)初始化static const值
解决VS2013无法用sizeof(成员变量)初始化static const成员的问题
这个问题我之前也碰到过,核心原因是Visual Studio 2013对C++11标准的部分特性支持不完整——虽然你的代码在GCC 5.3.1(以及基于GCC的MinGW)下符合C++11标准可以正常编译,但VS2013的编译器在处理“类内用非静态成员变量的sizeof值初始化static const成员”这个场景时,存在兼容性缺陷。
问题代码示例(你的MCVE)
假设你的代码结构类似这样:
#include <cstddef> class TestLib { int internal_member; public: // VS2013报错:无法用sizeof(internal_member)初始化这个static const变量 static const size_t member_size = sizeof(internal_member); };
用g++ -Wall -Wextra -std=c++11 -c staticTest.cpp编译完全正常,但在VS2013中会提示类似“成员引用必须是指向类的对象或指针”的错误。
两种可行解决方案
方案1:将static const成员的初始化移到类外(最稳妥)
把static const成员的声明留在头文件的类定义中,然后在.cpp实现文件中完成初始化,这样VS2013就能正确处理sizeof表达式:
// 头文件 staticTest.h #include <cstddef> class TestLib { int internal_member; public: // 仅声明static const成员 static const size_t member_size; };
// 实现文件 staticTest.cpp #include "staticTest.h" // 类外初始化,用类名限定访问成员变量 const size_t TestLib::member_size = sizeof(TestLib::internal_member);
方案2:用decltype替代直接引用成员变量(可选)
如果一定要在类内完成初始化,可以尝试用decltype来获取成员变量的类型,再计算sizeof,部分场景下VS2013能识别这种写法:
#include <cstddef> class TestLib { int internal_member; public: static const size_t member_size = sizeof(decltype(internal_member)); };
不过这个方案的兼容性不如方案1稳定,建议优先选择方案1。
补充说明
GCC 5.3.1完全支持C11中“用常量表达式(包括成员变量的sizeof)在类内初始化static const非整型成员”的特性,但VS2013的C11支持是阶段性的,直到后续的VS2015及以后版本才完善了这部分标准的实现。
内容的提问来源于stack exchange,提问作者yano
相关产品推荐
相关产品推荐

