พิจารณารหัสนี้:
#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 ฯลฯ