Я пытаюсь следующий код с тремя компиляторами (msvc2017, gcc8.2, clang7.0) и msvc2017 работает полностью, но gcc и clang нет. Я хочу понять, что не так с моим кодом, и почему компилятор не может его скомпилировать.
#include <cassert>
#include <iostream>
#include <cstdlib>
class Downloader
{
public:
struct Hints
{
int32_t numOfMaxEasyHandles = 8;
//Hints(){} // <= if I uncomment this all works gcc+clang+msvc
//Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works)
};
static Downloader *Create(const Hints &hints = Hints());
};
Downloader* Downloader::Create(const Hints &hints)
{
std::cout << hints.numOfMaxEasyHandles << std::endl;
return nullptr;
}
int main()
{
return 0;
}
Вы можете поиграть с этим кодом самостоятельно на https://wandbox.org/ и увидеть ошибку:
prog.cc:16:58: error: default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
static Downloader *Create(const Hints &hints = Hints());
^
prog.cc:11:37: note: defined here
int32_t numOfMaxEasyHandles = 8;
^~~~
Почему gcc и clang не скомпилируют этот код даже с uncomment Hints() = default
? Мои команды компиляции:
-
$ g++ prog.cc -std=gnu++2a
-
$ clang++ prog.cc -std=gnu++2a
Но если я раскомментирую Hints(){}
все три компилятора будут работать. Может быть, это ошибка компилятора? Заранее спасибо.