首页 > 解决方案 > 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()不同。

标签: c++templatesgccvisual-c++

解决方案


模板化非局部变量的动态初始化始终是无序的,即使相对于在同一翻译单元中定义的其他变量(部分原因是模板化变量也可能在其他翻译单元中定义)。在这个简单的情况下,您可以通过使用常量初始化来避免这个问题:添加constexprdecimal_def::unit_val以启用它,并添加到变量模板定义以清楚起见。


推荐阅读