C++ 重载解决问题:如何使向量填充构造函数重载而不是向量初始化列表构造函数?

问题描述 投票:0回答:1
#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
的工作原理一样)?

c++ vector constructor overload-resolution
1个回答
0
投票

底部显示的两种方法中的任何一种都是正确的解决方案。

除了构造函数的选择之外,与您的第一个代码片段没有语义差异。所以使用这些语法结构应该不会有任何问题。

就构造函数选择而言,花括号旨在表示您想要更喜欢将参数解释为“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);
© www.soinside.com 2019 - 2024. All rights reserved.