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 解决方案?

Visual Studio 中的 std::packaged_task 错误?

检测是不是安装了 Visual C++ Redistributable for Visual Studio 2013