gpt4 book ai didi

c++ - 使用字符串文字初始化 vector

转载 作者:可可西里 更新时间:2023-11-01 16:01:34 26 4
gpt4 key购买 nike

以下代码的正确行为是什么?

#include <vector>
#include <iostream>

int main()
{
std::vector<char> v = { "y", "z" };
std::cout << v[0];

return 0;
}

这被 Clang 接受了但不是 GCCVC++

这不是未定义的行为吗?

最佳答案

在深入研究标准之后,我发现了以下内容:

在这里,我正在尝试初始化 vector<char>使用两个字符串文字,而不是两个字符。使用 vector(initializer_list<T>) .在这种情况下,vector(initializer_list<char>) .

但是字符串文字的类型是“n const char 数组”,因此初始化列表构造函数不匹配。

不会导致编译器错误,因为编译器能够找到另一个匹配的构造函数

§13.3.1.7¶1 解释规则:

"When objects of non-aggregate class type T are list-initialized, overload resolution selects the constructor in two phases:

— Initially, the candidate functions are the initializer-list constructors of the class T and the argument list consists of the initializer list as a single argument [which we have seen didn't match].

— If no viable initializer-list constructor is found, overload resolution is performed again, where the candidate functions are all the constructors of the class T and the argument list consists of the elements of the initializer list."

这种情况下的匹配是:

template <class InputIterator> vector(InputIterator first, InputIterator last)

InputIterator 的类型没有 T 的信息在vector<T> .所以即使我正在初始化 vector<char> ,这两个参数可以是任意类型。唯一的要求是他们坚持 InputIterator属性,const char[]恰好发生。

构造函数认为它已将两个迭代器传递给相同的序列,但它实际上已经通过迭代器传递给两个完全不同的序列,"y""z" .

所以这个程序的结果是undefined

<支持>感谢克里斯的 comment这个帖子和他在那边提到的完全一样。参见 this

关于c++ - 使用字符串文字初始化 vector<char>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26837275/

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