【问题标题】:Default-construct inline static random number engines in gccgcc 中的默认构造内联静态随机数引擎
【发布时间】:2018-05-13 09:33:41
【问题描述】:

例如,

#include <random>

struct stru {
  //inline static std::mt19937 rnd; Oops!
  inline static std::mt19937 rnd{};  
};

int main() {

}

我看不出两者在语义上的区别,clang 编译两者都没有问题。然而gcc 8.1 第一个产生以下错误:

prog.cc:4:30: error: no matching function for call to 'std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::mersenne_twister_engine()'
   inline static std::mt19937 rnd;
                              ^~~
In file included from /opt/wandbox/gcc-8.1.0/include/c++/8.1.0/random:49,
                 from prog.cc:1:
/opt/wandbox/gcc-8.1.0/include/c++/8.1.0/bits/random.h:437:11: note: candidate: 'constexpr std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::mersenne_twister_engine(const std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>&)'
     class mersenne_twister_engine
           ^~~~~~~~~~~~~~~~~~~~~~~
/opt/wandbox/gcc-8.1.0/include/c++/8.1.0/bits/random.h:437:11: note:   candidate expects 1 argument, 0 provided
/opt/wandbox/gcc-8.1.0/include/c++/8.1.0/bits/random.h:437:11: note: candidate: 'constexpr std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::mersenne_twister_engine(std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>&&)'
/opt/wandbox/gcc-8.1.0/include/c++/8.1.0/bits/random.h:437:11: note:   candidate expects 1 argument, 0 provided

这是一个 gcc 错误(不是我的代码也不是 libstdc++),对吧?

【问题讨论】:

    标签: c++ gcc inline c++17 libstdc++


    【解决方案1】:

    这是一个 gcc 错误(不是我的代码也不是 libstdc++),对吧?

    没错。使用这个简短的 sn-p 可以更轻松地复制它:

    struct test {
        explicit test() {};
    };
    
    struct stru {
        inline static test t; 
    };
    
    int main() {
        test t;
    }
    

    explicit 说明符正在抛弃 GCC。必须调用相同的 c'tor 来初始化静态内联成员和局部变量。然而 GCC 很好地初始化了局部变量,但抱怨内联静态成员。

    【讨论】:

    • 我正在倾注于 GCC 的 Bugzilla,但还没有运气。它可能是一个 ureported。
    • 感谢您的确认。现在,我将只使用{} 解决方法。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多