Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?
Posted
技术标签:
【中文标题】Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?【英文标题】:Does Visual Studio 2013 CTP support in-class static const initializers for non-integral types?Visual Studio 2013 CTP 是否支持非整数类型的类内静态常量初始化程序? 【发布时间】:2014-03-26 07:51:00 【问题描述】:当我使用 g++(和上次我检查的 clang++)时,我可以将它写在标题中并期望它能够工作:
struct test
static constexpr float MEANING_OF_LIFE = 42.0f;
;
然而 Visual Studio 2013 CTP 需要这个(并且它编译时没有警告或错误):
struct test
static const float MEANING_OF_LIFE;
;
const float test::MEANING_OF_LIFE = 42.0f; // <- In the header, not a .cpp file.
这是 Visual Studio 的缺陷还是我做错了什么?
【问题讨论】:
constexpr 与 const 非常不同。如果你在 g++/clang 中使用“const”,他们不应该允许它。 【参考方案1】:第二种情况是错误的:应该是
struct test
static const float MEANING_OF_LIFE;
;
const float test::MEANING_OF_LIFE = 42.0f; // In an implementation file
实际的定义需要放在实现 (.cpp) 文件中,而不是在标头中,否则您将违反 ODR。
第一种情况是有效的 C++11,但我猜 Visual Studio 还不支持它。 (如果您使用整数类型而不是 float
,它可能会起作用,因为这在 C++98 中也是允许的。)
【讨论】:
"实际的定义需要放在一个实现 (.cpp) 文件中,而不是在头文件中"。 需要还是应该?正如我发布的那样,它确实有效;编译时没有警告或错误。 @DrTwox 如果您只在一个 .cpp 文件中包含标头,那么您将侥幸成功。但是,如果您将它包含在多个 .cpp 文件中,则它可以编译,但由于重复的test::MEANING_OF_LIFE
符号而无法链接。 (当然,除非您的 test
类是模板化的,但那是另一回事。)以上是关于Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章
再次记录 Visual Studio 2015 CTP 5 的一个坑
Matlab 中的 Visual Studio 2012 编译器更新
是否可以在 Visual Studio 2013 中使用 asp.net mvc 6?
Visual Studio 2017 RC 是不是向后兼容 Visual Studio 2013 解决方案?