【发布时间】:2020-03-03 14:42:25
【问题描述】:
考虑这段代码:
#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> 的匹配度如何?
构造函数签名肯定可以进一步修剪,但我只是被一段等效的代码欺骗了,想确保这个问题没有丢失任何重要的东西。
【问题讨论】:
-
如果我正确地记得
{}作为代码块,将 0 分配给变量 - 例如: const char x = {};设置为 0 (null char) ,与 int 等相同。 -
@Seti 这就是
{}在某些特殊情况下的有效作用,但通常并不正确(对于初学者来说,std::vector<int> x = {};有效,std::vector <int> x = 0;无效)。可不是“{}赋值为零”那么简单。 -
对,它不是那么简单,但它仍然分配零 - 我认为这种行为很混乱,不应该真正使用
-
我仍然认为默认构造的值令人困惑(需要您始终检查行为或保留很多知识)
标签: c++ language-lawyer overload-resolution