使用constexpr初始值设定项\u list构造函数时,MSVC无法编译 为什么微软Visual C++在编译以下代码时失败?p> template <typename T> struct slice { size_t length; T *ptr; constexpr slice(std::initializer_list<T> list) : length(list.size()), ptr(list.begin()) {} }; static_assert(slice<const int>({ 1, 2, 3 }).length == 3, "!!");

使用constexpr初始值设定项\u list构造函数时,MSVC无法编译 为什么微软Visual C++在编译以下代码时失败?p> template <typename T> struct slice { size_t length; T *ptr; constexpr slice(std::initializer_list<T> list) : length(list.size()), ptr(list.begin()) {} }; static_assert(slice<const int>({ 1, 2, 3 }).length == 3, "!!");,c++,c++11,visual-c++,constexpr,initializer-list,C++,C++11,Visual C++,Constexpr,Initializer List,initializer\u list的实现将所有方法标记为constexpr,看起来对我来说应该没问题。。。也许这只是编译器的问题?TL;DR:这是一个编译器标准问题,因为您的代码可以很好地编译,但两者都可以编译您的代码 在C++11中,没有一个方法被标记为constexpr,因此不能在静态断言中使用它 您必须注意,Visual Studio 2015没有完整的constexpr支持。见文章中的表格。它只实现了std::initializer\u list的C++11版本,没有任何conste

initializer\u list
的实现将所有方法标记为
constexpr
,看起来对我来说应该没问题。。。也许这只是编译器的问题?

TL;DR:这是一个编译器标准问题,因为您的代码可以很好地编译,但两者都可以编译您的代码


在C++11中,没有一个方法被标记为
constexpr
,因此不能在
静态断言中使用它

您必须注意,Visual Studio 2015没有完整的
constexpr
支持。见文章中的表格。它只实现了
std::initializer\u list
的C++11版本,没有任何
constepr
函数

小更新:标准中的错误措辞可能会导致非常量
std::initializer\u list

根据§18.9.2(重点):

初始值设定项列表
类型的对象提供对
常量
类型的对象数组的访问。[注:一对指针或一个指针加上一个长度将是
初始值设定项列表
初始值设定项列表
用于实现8.5.4中规定的初始值设定项列表。复制初始值设定项列表不会复制基础元素。
-[完注]

因此,
initializer\u list
实现的私有成员不需要是非易失性文本类型;但是,因为他们提到他们相信一对指针或一个指针和一个长度将是“明显的表示”,他们可能没有考虑到某人可能在“代码”>“初始化列表”列表< /CO> >中加入非文字的东西。 (无耻地抄袭了answer。)它更深入地讲述了为什么不能在
constexpr
上下文中使用
std::initializer\u list

这已在Visual Studio 2017中“修复”。

请尝试启用该设置,它将消除编译错误。

我的VS2015
编译它所使用的所有方法确实都有
constexpr
,这就是为什么我很惊讶它不起作用的原因。@ManuEvans这很奇怪。经过调查,我发现原因是标准中的措辞不当,在VS 2015的实施过程中似乎没有得到纠正。请参见编辑:)@Rakete1111-已确认编译VS2017@Jeff谢谢你的信息!:)@杰夫:这很有趣,我试图切换到2017年,但遇到了一个更大的问题:不适合我。但是,关闭SDL检查是可行的。
1>test.cpp(12): error C2131: expression did not evaluate to a constant
1>         visual studio 14.0\vc\include\initializer_list(50): note: failure was caused by an undefined arithmetic operation