나는이 GCC와 연타 실패 놀랍게도이 코드컴파일러는 "A (A & amp;)"가 잠시 동안 rvalues를 허용한다고 생각합니까?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
있습니다. 연타는 두 번째 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()});
}
그들은 모두 두 번째 f
전화 잘 작동, 나에게 더 이상이다.
감사! '{...} '의 경우에는 그러한 규칙을 찾을 수 없습니다. 이것이 {{}} 사례가 왜 효과가 있는지 설명하고 있습니까? –
@ JohannesSchaub-litb : 나는 잘 모르겠다. tbh, 당신은 _braced-init-list_와 함께 함수를 호출한다. 그래서 규칙은 분명히 다르다. –
@ JohannesSchaub-litb [over.ics.list]를 참조하십시오. 나는 그것이 over.ics와 관련이 있다고 생각한다.ref]/3 (이전에 코드를 잘못 읽었습니다) : 실행 가능 함수의 서브 세트를 만들 때 임시 (A & A)는 임시가 아닌 좌변 치 참조에 임시 변수를 바인드하므로 실행 가능하지 않은 것으로 간주됩니다. – dyp