gpt4 book ai didi

c++ - 隐式构造函数转换适用于显式 vector::vector,只是有时

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:37 25 4
gpt4 key购买 nike

我喜欢将二维数组初始化为vector<vector<int> >(x,y) . x传递给 vector<vector<int> >的构造函数和 y传递给 vector<int>的构造函数,x次。虽然这似乎被C++03禁止了,因为构造函数是explicit ,它始终有效,即使在 Comeau 上也是如此。我也可以调用 vector::assign像这样。但是,出于某种原因,不是 vector::push_back .

        vector< vector< int > > v( 20, 40 ); // OK: convert 40 to const T&
v.assign( 30, 50 ); // OK
v.push_back( 2 ); // error: no conversion, no matching function, etc.

出于某种原因,前两个示例实际上是否合规?为什么我可以转换4050但不是 2


结语:参见 http://gcc.gnu.org/onlinedocs/libstdc++/ext/lwg-defects.html#438为什么大多数编译器都允许这样做,但标准正在向另一个方向转变。

最佳答案

您关于 Comeau 隐式调用 explicit 的假设构造函数很可能不正确。该行为确实已损坏,但问题有所不同。

我怀疑这是 Comeau 附带的标准库实现中的错误,而不是核心 Comeau 编译器本身的错误(尽管在这种情况下线条很模糊)。

如果您构建一个具有类似于 std::vector 的构造函数属性的快速虚拟类并尝试同样的事情,你会发现编译器正确地拒绝执行构造。

它接受您的代码的最可能原因是众所周知的 std::vector 的双参数构造函数的形式歧义。 .可以理解为(size, initial value)构造函数

explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());

或作为(begin, end)模板构造函数,后者接受两个迭代器

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

标准库规范明确指出,当两个整数值用作参数时,实现必须以某种方式确保选择了形成的构造函数,即 (size, initial value) .它是如何完成的 - 无关紧要。它可以在库级别完成,也可以在核心编译器中进行硬编码。它可以通过任何其他方式完成。

但是,响应( 20, 40 ) arguments Comeau 编译器似乎错误地使用 InputIterator = int 选择并实例化了后一个构造函数.我不知道它是如何设法编译构造函数的专用版本的,因为整数值不能也不会用作迭代器。

如果你试试这个

vector< vector< int > > v( 20U, 40 ); 

您会发现编译器现在报告错误(因为它不能再使用构造函数的双迭代器版本)和 explicit在第一个构造函数上阻止它转换 40std::vector .

同样的事情发生在 assign 上.这当然是 Comeau 实现的一个缺陷,但是,实验再一次表明,很可能应该在库级别强制执行所需的行为(核心编译器似乎工作正常),但不知何故却错误地完成了。


转念一想,我解释的大意是对的,但是细节不对。此外,我将其称为 Comeau 中的问题可能是错误的。科莫可能就在这里。

标准在 23.1.1/9 中说

the constructor

template <class InputIterator>  
X(InputIterator f, InputIterator l, const Allocator& a = Allocator())

shall have the same effect as:

X(static_cast<typename X::size_type>(f),  
static_cast<typename X::value_type>(l),
a)

if InputIterator is an integral type

我怀疑如果按字面解释上述内容,则允许编译器假定显式 static_cast隐含在那里(好吧......可以这么说),并且代码出于同样的原因是合法的static_cast< std::vector<int> >(10)是合法的,尽管相应的构造函数是 explicit . static_cast的存在是什么使编译器可以使用 explicit构造函数。

如果 Comeau 编译器的行为是正确的(而且我怀疑它实际上是正确的,正如标准所要求的那样),我想知道委员会是否打算留下这样的漏洞,并允许实现解决 explicit vector 元素的构造函数可能存在限制。

关于c++ - 隐式构造函数转换适用于显式 vector::vector,只是有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1943228/

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