有効なC++ 11は有効ですか?コンストラクタNoWay::NoWay
の両方の引数にはデフォルト値がありますが、一方は宣言で指定され、他方は定義で指定されます。C++は、宣言と定義の間でデフォルトのパラメータ値を分割します
#include <iostream>
class NoWay {
private:
int foo;
bool bar;
public:
explicit NoWay(int foo, bool bar = true);
bool isGood();
};
NoWay::NoWay(int foo = 4, bool bar) {
this->foo = foo;
this->bar = bar;
}
bool NoWay::isGood() { return (foo == 4) && (bar == true); }
int main(int argc, char **argv) {
auto noway = NoWay();
std::cout << noway.isGood() << std::endl;
}
これはgccの下にエラーなし
$ g++ --std=c++11 foo.cc
コンパイルが、打ち鳴らすが、問題は問題の核心1344として知られている
$ clang++ --std=c++11 foo.cc
foo.cc:13:18: error: addition of default argument on redeclaration makes this constructor a default constructor
NoWay::NoWay(int foo = 4, bool bar) {
^ ~
foo.cc:9:12: note: previous declaration is here
explicit NoWay(int foo, bool bar = true);
^
1 error generated.
Exit 1
ハードコーディングだけではなく、this-> foo = 4ですか? –
必要なパラメータの前にオプションのパラメータを指定することはできません。引数リストの最後にのみパラメータを省略できるからです。 – Barmar
@Barmar両方のパラメータはオプションであるが、宣言と定義の間では「オプションの構文的表現」を分割することが意図されています。あなたはその定義が構文的にうまく構成されていないと言っていますか? –