跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个 msvc 与 gcc/clang 不一致的例子,哪边是对的?
未分類
20 11 月 2020

一个 msvc 与 gcc/clang 不一致的例子,哪边是对的?

一个 msvc 与 gcc/clang 不一致的例子,哪边是对的?

資深大佬 : wutiantong 6

下面的代码基于 C++17,msvc 是最新版本的( 16.8.2 ),gcc/clang 也是最新版本的,可在线运行:godblot

namespace user {     template<typename T> const T unit { 1 };      template<typename Def>     struct data     {         typename Def::value_type 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; }     };     using decimal_data = data<decimal_def>;     inline const auto decimal_data_unit = unit<decimal_data>; }  #include <iostream> int main() {     std::cout << user::decimal_data_unit.val << std::endl; }  

预期输出:10

msvc 输出:0

gcc/clang 输出:10

大佬有話說 (5)

  • 主 資深大佬 : wutiantong

    顺带提一下,这样修改可以使 msvc 的输出符合预期:

    inline const auto & decimal_data_unit = unit<decimal_data>;

    主要想讨论一下,上面的写法是否有问题,还是编译器的 bug ?

  • 資深大佬 : lcdtyph

    static constexpr value_type unit_val() noexcept { return 10; }

  • 主 資深大佬 : wutiantong

    @lcdtyph 确实是 work 的,而且我发现问题还跟 data 的构造函数有关:

    如果给 data 上一个普通的构造函数,结果又不行了(变成 0 ),需要再进一步把构造函数修饰成 constexpr (这也说明例子中原本默认的 aggregate 构造函数是 constexpr,但我好像没找到标准说明?)

    所以问题是,这个行为到底是 msvc 比较正确还是 gcc 比较正确呢?

  • 資深大佬 : lcdtyph

    @wutiantong
    我对标准了解的不深,说不上哪边是对的…我也没有 msvc 环境,上面的修改是根据经验改的

  • 資深大佬 : Wirbelwind

    @wutiantong 不是构造函数的问题

    在初始化的时候需要调用 unit_val(),问题是编译器 什么时候 用 unit_val()的返回值对它赋值

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具