이 코드를 고려하십시오.
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
인쇄합니다 :
vector overload
int overload
모호한 과부하 해결로 인해 컴파일 오류가 발생하지 않는 이유는 무엇입니까? 두 번째 생성자가 제거되면 vector overload두 번 얻 습니다. 메트릭 어떤 것은 의해 어떻게 / int는 명확하게 더 나은 일치 {}보다 더 std::vector<int>?
생성자 서명은 확실히 더 잘릴 수는 있지만 동등한 코드 조각에 속아서이 질문에 중요한 것이 없어야합니다.
{}특정 특수한 경우에 효과적으로 수행되는 것이지만 일반적으로 정확 하지는 않습니다 (초보자, std::vector<int> x = {};작업, std::vector <int> x = 0;그렇지 않음). " {}0을 할당 "하는 것만 큼 간단하지 않습니다 .
struct A { int x = 5; }; A a = {};는 어떤 의미로도 0을 할당하지 않으며 Awith를 구성합니다 a.x = 5. 이는 0으로 A a = { 0 };초기화되는 것과 달리 a.x0은 고유하지 않으며 {}각 유형이 기본 구성 또는 값으로 초기화되는 방식에 고유합니다. 여기 , 여기 및 여기를 참조 하십시오 .
{}코드 블록으로 corretly 를 호출 하면 변수에 0을 할당합니다. 예 : const char x = {}; int 등과 동일하게 0 (null char)으로 설정됩니다.