【发布时间】:2019-08-30 10:31:19
【问题描述】:
这个问题很可能已经被问过了,但我没有找到答案。
下面的代码使用 gcc 编译,但在运行时崩溃,出现 std::length_error (live)。
void test(const std::string &value) { std::cout << "string overload: " << value << std::endl; }
//void test(const std::vector<std::string> &) { std::cout << "vector overload" << std::endl; }
int main()
{
test({"one", "two"});
}
从字符串的初始化列表创建字符串的能力似乎存在争议,例如,不能创建上面代码中注释掉的重载。
但即使允许这样的构造,为什么会导致失败?
【问题讨论】:
-
initializer_list版本的std::string仅适用于字符列表,不适用于字符串列表。使用字符串列表,您可以获得对象的标准列表初始化。注释重载是可以的,只要不模棱两可。 IE。如果列表有超过 2 个元素。 -
注意(因为这不是主要问题):这里的问题来自
"one"和"two"不是std::strings。您可以使用test({{"one"}, {"two"}});或使用 C++17 字符串文字test({"one"s, "two"s});(使用using namespace std::literals;)。任一will work。 -
@Max Langhof,谢谢!
标签: c++ constructor initializer-list overload-resolution constructor-overloading