【发布时间】:2015-07-17 04:08:39
【问题描述】:
我有以下代码,它在 gcc 和 clang 上的行为与预期一致。但是,MSVC 给了我一个意想不到的结果。
让我们先看看有问题的代码。
#include <iostream>
// -----------------------------------------------
class Test // Dummy for MCVE
{
public:
Test();
void Print();
private:
int arr[5];
};
Test tst;
// -----------------------------------------------
template<typename T>
struct range // some stuff not needed by example removed
{
constexpr range(T n) : b(0), e(n) {}
constexpr range(T b, T e) : b(b), e(e) {}
struct iterator
{
T operator*() { return i; }
iterator& operator++() { ++i; return *this; }
bool operator!=(iterator other) { return i != other.i ; }
T i;
};
iterator begin() const { return{ b }; }
iterator end() const { return{ e }; }
private:
T b,e;
};
constexpr range<int> coord(5);
// -----------------------------------------------
Test::Test()
{
for(auto i : coord)
arr[i]=i;
}
void Test::Print()
{
for(auto i : coord)
std::cout << arr[i] << std::endl;
}
// -----------------------------------------------
int main()
{
tst.Print();
}
现在,在 clang 和 gcc 上都会打印 '0 1 2 3 4'
但是,在 MSVC 上,这会打印 '0 0 0 0 0'
原因是当构造函数对全局变量tst
运行时,'coord' 尚未初始化(到 0,5),但它也不是随机的,而是 (0,0)。
对我来说,constexpr 初始化发生在常规初始化之前是有意义的。这种行为是否符合 MSVC?
我可能应该注意到我使用的是 MSVC 版本 14.0.22823.1,并且 可以通过改变顺序得到预期的结果 声明
【问题讨论】:
标签: c++