none
一个 msvc 与 gcc/clang 不一致的例子,原因何在? RRS feed

  • 问题

  • 下面的代码基于C++17,各编译器都选用最新版本,在线查看:https://godbolt.org/z/jMsrEW

    namespace testing
    {
        template<typename T> const T unit { 1 };
    
        template<typename Def>
        struct data
        {
            typename Def::value_type val;
            //NOTE2: data(typename Def::value_type const & _) : val(_) {}
            //NOTE3: constexpr data(typename Def::value_type const & _) : val(_) {}
        };
        template<typename Def> const data<Def> unit<data<Def>> { Def::unit_val() };
    
        struct decimal_def
        {
            using value_type = int;
            static value_type unit_val() noexcept { return 10; }
            //NOTE1: static constexpr value_type unit_val() noexcept { return 10; }
        };
        using decimal_data = data<decimal_def>;
        inline const auto decimal_data_unit = unit<decimal_data>;
    }
    
    #include <iostream>
    int main()
    {
        std::cout << testing::decimal_data_unit.val << std::endl;
    }
    

    预期输出10,gcc/clang符合预期,但msvc输出0,

    更进一步的,如果选择NOTE1这行代码,msvc会输出10,但是,再加上NOTE2这行则会变回0,用NOTE3替代NOTE2可以得到10,

    gcc/clang则始终输出为10。

    请问从标准角度来看,到底发生了什么?

    2021年1月14日 9:17

全部回复

  • 你好,

    感谢您在MSDN中文论坛发帖提问。

    关键字 constexpr 是在 c + + 11 中引入的,并在 c + + 14 中得到改进。 它表示* const ant 表达式*。constexpr 整数值可用于需要整数的任何位置 const ,例如模板参数和数组声明中的。 在编译时(而非运行时)计算某个值时,它可帮助您的程序运行速度更快,使用更少的内存。constexpr 函数或 const ructor 是隐式的 inline

    可以使用非constexpr参数调用常量表达式函数或构造函数。正如可以将constexpr整数常量分配给非constexpr变量一样,也可以使用非constexpr参数调用constexpr函数,并将结果存储在非constexpr变量中。当表达式的所有成员均为constexpr时,关键字仅允许编译时保持恒定。

    因此,我认为GCC在这方面是不正确的。

    Best Regards,

    Jeanine


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年1月22日 7:12
    版主