이 코드를 고려하십시오.
#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을 할당하지 않으며 A
with를 구성합니다 a.x = 5
. 이는 0으로 A a = { 0 };
초기화되는 것과 달리 a.x
0은 고유하지 않으며 {}
각 유형이 기본 구성 또는 값으로 초기화되는 방식에 고유합니다. 여기 , 여기 및 여기를 참조 하십시오 .
{}
코드 블록으로 corretly 를 호출 하면 변수에 0을 할당합니다. 예 : const char x = {}; int 등과 동일하게 0 (null char)으로 설정됩니다.