c++ - msvc 和 gcc 不同的行为
问题描述
#include <iostream>
template<typename T>
const T unit{ 1 };
template<typename T>
struct data
{
typename T::value_type val;
};
struct decimal_def
{
using value_type = int;
static const value_type unit_val() {
return 10;
}
};
template<typename T>
const data<T> unit<data<T>> { T::unit_val() };
auto decimal_data_unit = unit<data<decimal_def>>;
int main(){
std::cout << decimal_data_unit.val << std::endl;
return 0;
}
exoect:10
gcc:10
msvc:0
我认为 gcc 和 msvc 之间差异的原因是编译器优化unit_val()
不同。
解决方案
模板化非局部变量的动态初始化始终是无序的,即使相对于在同一翻译单元中定义的其他变量(部分原因是模板化变量也可能在其他翻译单元中定义)。在这个简单的情况下,您可以通过使用常量初始化来避免这个问题:添加constexpr
到decimal_def::unit_val
以启用它,并添加到变量模板定义以清楚起见。