考虑以下代码:
#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>
?
可以肯定地进一步减少构造函数的签名,但是我只是被等效的代码所欺骗,并希望确保对该问题没有任何重要的认识。
@Seti这就是
—
马克斯·朗霍夫
{}
在某些特殊情况下,有效的做法,但它不是通常是正确的(对于初学者来说,std::vector<int> x = {};
工作的,std::vector <int> x = 0;
不)。它不像“ {}
分配零” 那样简单。
是的,它不是那么简单,但是它仍然分配零-以为我认为这种行为非常令人困惑,不应该真正使用
—
Seti
@Seti
—
Max Langhof
struct A { int x = 5; }; A a = {};
没有在任何意义上分配了零,构建一个A
与a.x = 5
。这与A a = { 0 };
不会初始化a.x
为0的情况不同。零不是固有的{}
,它对于每种类型如何进行默认构造或值初始化是固有的。看到这里,这里和这里。
我仍然认为默认构造的值令人困惑(要求您始终检查行为或保持足够的知识)
—
Seti
{}
作为一个代码块正确地回想起,则将0赋给变量-例如:const char x = {}; 被设置为0(空字符),同样对于int等