は、私は、これはGCCやクランで失敗し、私の驚きにこのコードコンパイラは "A(A&)"が右辺値を受け入れると考えていますか?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
を持っています。二f
が正常に動作したときに、彼らは、最初のf
を選択しないのはなぜ打ち鳴らすには、例えば
Compilation finished with errors:
source.cpp:8:10: error: no matching constructor for initialization of 'A'
f(A());
^~~
source.cpp:1:21: note: candidate constructor not viable: expects an l-value for 1st argument
struct A { A(); A(A&); };
^
source.cpp:1:16: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
struct A { A(); A(A&); };
^
source.cpp:4:13: note: passing argument to parameter here
void f(A);
を言いますか?最初にf
を削除すると、呼び出しは成功します。彼らはすべて二f
を呼び出して、私はブレースの初期化、を使用している場合、それはまた、正常に動作します
int main() {
f({A()});
}
、私にはもっと奇妙な何かです。
ありがとうございます!私は '{...}'の場合にそのような規則を見つけることができません。それは '{...}'のケースがなぜ機能するのかを説明していますか? –
@ JohannesSchaub-litb:わかりません、tbh、あなたは_braced-init-list_で関数を呼び出しているので、ルールはまったく異なります。 –
@ JohannesSchaub-litb [over.ics.list]を参照してください。私はそれがover.icsと関係があると思う。(A&A)は、一時的ではない左辺値の参照にバインドするため、実行可能な関数のサブセットを形成するときに実行可能とはみなされません。 – dyp