1
3
我查看了GCC的STL实现,它应该有类似的行为。这就是原因。
标准不要求显式转换工作或隐式转换在初始化具有范围的容器时不工作。它只是说范围被复制到容器中。对你的目的来说肯定是模棱两可的。 令人惊讶的是,考虑到他们如何在考虑诸如 the one I had 几周前。 |
2
1
我想这取决于
|
3
1
这是一个相当棘手的问题,可能是VisualStudio是对的,而Comeau是错的(这似乎真的很难相信)。 如果逐字阅读,则标准将根据 复制构造函数 (见引号),字面意思是通过取消对迭代器的引用而获得的对象必须首先转换为T类型,然后才应该调用复制构造函数。此时,使用显式构造函数,代码不应该编译。 另一方面,期望一个实现直接调用一个以未引用迭代器为参数的构造函数似乎是合理的,在这种情况下,构造函数调用将是显式的,因此代码应该编译。这与下面引文中的确切措辞不符,因为 复制构造函数 为给定的类型t定义为一个构造函数,该构造函数接受对类型t的对象的单个可能常量引用。
我想不出任何合理的理由不使用comeau方法,我认为(这只是个人的观点)标准中关于向量构造器复杂性的措辞可能应该重新表述为要求
只有n个调用对应的t构造函数
,在适当的情况下,必须定义为与调用匹配的构造函数。
23.2.4.1[lib.vector.cons]/1
我想知道在给定的情况下vs编译器的行为:
使用G++的结果是
|
4
1
这实际上归结为如何实现STL库的问题,而不是语言规范问题。语言规范中没有任何内容会禁止它工作,也没有任何内容会要求它工作。 如果编写stl::vector构造函数以尝试使用赋值运算符进行隐式转换,那么它将失败。更可能的是,Microsoft STL实现通过构造函数调用在初始化期间使用返回值优化,在这种情况下,此代码可以正常工作。 需要注意的是,这项工作的唯一原因是stl::vector构造函数是模板化的,唯一的要求是它是一个输入迭代器,或者更准确地说,它支持输入迭代器的所有必需功能。 我还想指出,这是一个主要的例子,说明为什么编写跨平台代码通常很困难。有时,您会遇到这样的问题:两个编译器都不一定偏离语言标准,但代码仍然是不可移植的。 |
5
0
此代码不在COMEAU中编译:
错误信息:
因此,在基本级别上,联机编译器支持显式构造函数。必须与向量/迭代器有关。 编辑 但是,这可编译为:
这是一个明确的转换,所以没关系。我猜comeau向量类在构造函数的某个地方做了一个显式的强制转换,而微软的库却没有。 关于显式构造函数的更多信息- http://www.glenmccl.com/tip_023.htm |
6
0
是的,它应该编译。如果不使用构造函数,那么它的明确性就不是问题。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |