gpt4 book ai didi

c++ - 为什么具有两个元素的初始化语法将一个元素而不是两个元素放入字符串 vector ?

转载 作者:行者123 更新时间:2023-12-01 22:34:29 24 4
gpt4 key购买 nike

为什么我在 b 中得到一个元素而不是两个?在 a 中,我按预期得到了一个元素,在 c 中,按预期得到了三个元素。具有两个值的那个在某种程度上是一种特殊情况。

#include <string>
#include <vector>
#include <iostream>

void print(const std::string& name, const std::vector<std::string>& v)
{
std::cout << name << ' ' << v.size() << '\n';
for (const auto& str : v) {
std::cout << str << '\n';
}
std::cout << "\n";
}

int main()
{
std::vector<std::string> a = {{"str1"}};
std::vector<std::string> b = {{"str1", "str2"}};
std::vector<std::string> c = {{"str1", "str2", "str3"}};
print("a", a);
print("b", b);
print("c", c);
return 0;
}

打印:

a 1
str1

b 1
str1

c 3
str1
str2
str3

我猜这与 vector vector 的过载有关。

template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );

我使用 clang 9.0.0 和 -std=c++17 -O2 -Wall 作为标志。

对于b,编译器做了什么?为什么它在一种情况下决定它是迭代器,而在其他情况下决定它是初始值设定项列表?我的示例代码是否定义良好或者是否有 UB?

最佳答案

Is my sample code well defined or does it have UB?

它确实有UB。采用 first-last 迭代器对的构造函数假定两个迭代器引用相同的序列。 {{"str1"}, {"str2"}} 不满足此要求,因此为 UB。

What did the compiler do in the case of b? Why did it decide it's an iterator in one case and initializer list in the other cases?

回想一下,字符串文字“str1”的类型是char const[5]。但是,对 std::initializer_list 的构造函数重载的调用适用于 std::string 实例。这需要隐式转换 - 由于两个迭代器的构造函数模板不需要此类转换,因此它被认为是更好的匹配。

<小时/>

您可以通过使用一对大括号强制直接列表初始化来解决此问题,

std::vector<std::string> b2 = {"str1", "str2"};

或者通过手动指定所需的类型至少一次:

std::vector<std::string> b3 = {{std::string("str1"), "str2"}};

using namespace std::string_literals;
std::vector<std::string> b4 = {{"str1"s, "str2"s}};

关于c++ - 为什么具有两个元素的初始化语法将一个元素而不是两个元素放入字符串 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58287901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com