Встроенные статические движки случайных чисел в gcc - PullRequest
0 голосов
/ 13 мая 2018

Например,

#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 ++), верно?

1 Ответ

0 голосов
/ 13 мая 2018

Это ошибка gcc (не мой код и не libstdc ++), верно?

правый. Это может быть намного легче воспроизведено с помощью этого короткого фрагмента:

struct test {
    explicit test() {};
};

struct stru {
    inline static test t; 
};

int main() {
    test t;
}

Спецификатор explicit сбрасывает GCC. Один и тот же c'tor должен вызываться как для инициализации статического встроенного члена, так и для локальной переменной. И все же GCC прекрасно инициализирует локальную переменную, но жалуется на встроенный статический член.

...