พิจารณารหัสนี้:
#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>?
ลายเซ็นตัวสร้างสามารถตัดต่อได้ แต่ฉันเพิ่งถูกหลอกด้วยโค้ดที่เทียบเท่ากันและต้องการให้แน่ใจว่าไม่มีอะไรสำคัญที่หายไปสำหรับคำถามนี้
{}มีประสิทธิภาพในบางกรณีพิเศษ แต่โดยทั่วไปจะไม่ถูกต้อง (สำหรับ starters, std::vector<int> x = {};works, std::vector <int> x = 0;not) มันไม่ง่ายเหมือน " {}กำหนดศูนย์"
struct A { int x = 5; }; A a = {};ไม่ได้กำหนดเป็นศูนย์ในความรู้สึกใด ๆ ก็สร้างกับA a.x = 5สิ่งนี้ไม่เหมือนA a = { 0 };ซึ่งจะเริ่มต้นa.xเป็น 0 ศูนย์ไม่ได้มีอยู่ในตัว{}มันเป็นสิ่งที่สืบทอดว่าแต่ละประเภทนั้นถูกสร้างขึ้นเป็นค่าเริ่มต้นหรือกำหนดค่าเริ่มต้นได้อย่างไร ดูที่นี่ , ที่นี่และที่นี่
{}เป็นบล็อกของรหัสกำหนด 0 ให้กับตัวแปร - ตัวอย่าง: const char x = {}; ถูกตั้งค่าเป็น 0 (null ถ่าน) เหมือนกันสำหรับ int ฯลฯ