Bu GCC ve Clang ile başarısız Benim için sürpriz bu koduDerleyici, "A (A &)" ifadesinin bir an için rimini kabul ettiğini düşünüyor?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
var. Clang ikinci f
çalışıyor iken
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);
Neden ilk f
seçerim örneğin diyor? İlk f
'u kaldırırsam, çağrı başarılı olur. Ne ayracı başlatma kullanırsanız, o da
int main() {
f({A()});
}
Hepsi ikinci f
çağrı çalışıyor, benim için daha garip.
Teşekkürler! “{...}” davası için böyle bir kural bulamıyorum. Bu, '{...}' durumunun neden işe yaradığını açıklıyor mu? –
@ JohannesSchaub-litb: Emin değilim, tbh, işlevi bir _braced-init-list_ ile çağırıyorsunuz, bu yüzden kurallar kesinlikle farklı. –
@ JohannesSchaub-litb Bkz. [Over.ics.list]. Sanırım bu konuyla ilgili.ref]/3 (kodunuzu daha önce yanlış okuyorum): Canlı işlevlerin alt kümesini oluştururken, “A (A &)” ifadesi, bir const olmayan lvalue referansına geçici olarak bağlandığı için geçerli kabul edilmez. – dyp