#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<char> v1 = { size_t(0),0 };
vector<char*> v2 = { size_t(0),0 };
cout << v1.size() << endl;// 2
cout << v2.size() << endl;// 0
return 0;
}
v1
调用初始化列表,但 v2
调用填充构造函数。
我确实知道显式调用 fill 构造函数是有效的。
vector<char> v1 = vector<char>(size_t(0), 0);
vector<char> v1(size_t(0), 0);
但是有没有办法让
v1
重载 fill 构造函数,而不显式调用它(就像 v2
的工作原理一样)?
底部显示的两种方法中的任何一种都是正确的解决方案。
除了构造函数的选择之外,与您的第一个代码片段没有语义差异。所以使用这些语法结构应该不会有任何问题。
就构造函数选择而言,花括号旨在表示您想要更喜欢将参数解释为“elements”,在特定于类型的某种含义中,而不是任何其他解释。
在
vector<char*> v2 = { size_t(0),0 };
的情况下,无法将 size_t(0)
解释为 char*
,因为 size_t(0)
无法隐式转换为 char*
,因为它不是像文字 0
那样的空指针常量
是。因此选择另一种解释作为构造函数参数。
但是,在现代 C++ 中,您不应该像使用
0
作为 0
的参数那样依赖从 char*
值整数文字到空指针值的隐式转换。从 C++11 开始,就有了 nullptr
,它不可能有很多令人惊讶的交互。 0
文字的特殊行为仅用于向后兼容。
所以,如果你想表示你想要一个向量填充第二个参数的
0
副本,你不应该写大括号,而应该写:
vector<char> v1(0, 0);
vector<char*> v2(0, nullptr);