- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑以下代码:
struct A {
int x;
};
int main() {
A a;
A b{a};
}
这个程序在 C++11 标准下是否良构?在我的 N3797 拷贝中它说
8.5.4 List initialization
[dcl.init.list]
3: List-initialization of an object or reference of type
T
is defined as follows:
- IfT
is an aggregate, aggregate initialization is performed (8.5.1).
- Otherwise, ifT
is a specialization ofstd::initializer_list<E>
, ...
- Otherwise, ifT
is a class type, constructors are considered. The applicable constructors are enumerated and the best one is chosen using overload resolution. If a narrowing conversion is required to convert any of the types, the program is ill-formed.
- Otherwise, if the initializer list has a single element of typeE
and eitherT
is not a reference type or it is reference-related toE
, the object or reference is initialized from that element; if a narrowing conversion is required to convert the element toT
, the program is ill-formed.
- Otherwise, ifT
is a reference type, a pr-value temporary of the type reference byT
is copy-list-initialized or direct-list-initialized, depending on the kind of initialization for the reference, and the reference is bound to that temporary.
- Otherwise, if the initializer list has no elements, the object is value-initialized.
- Otherwise, the program is ill-formed.
这个例子的要点是,类型是一个聚合,但是列表初始化应该调用复制构造函数。在 gcc 4.8
和 gcc 4.9
,在 C++11 标准下,它失败了:
main.cpp: In function ‘int main()’:
main.cpp:7:8: error: cannot convert ‘A’ to ‘int’ in initialization
A b{a};
^
并说A is not convertible to int
或类似的,因为聚合初始化失败。在 gcc 5.4
,它在 C++11 标准下运行良好。
关于 clang
你会得到类似的错误 clang-3.5
, 3.6
, 它开始工作于 clang-3.7
.
我知道它在 C++14 标准下是良构的,并且在缺陷报告中提到了它 here .
但是,我不明白为什么这被认为是标准中的缺陷。
标准写的时候,
“如果 X
,则执行 foo 初始化。否则,如果 Y
,则执行 bar 初始化,....否则,程序格式错误。”,
这是否意味着如果X
成立,但无法执行 foo 初始化,那么我们应该检查是否 Y
持有,然后尝试栏初始化?
这将使示例工作,因为当聚合初始化失败时,我们不匹配 std::initializer_list
,我们匹配的下一个条件是“T
是类类型”,然后我们考虑构造函数。
请注意,这确实似乎是它在这个修改后的示例中的工作方式
struct A {
int x;
};
int main() {
A a;
const A & ref;
A b{ref};
}
在 C++11 和 C++14 标准中,所有相同的编译器都以与前面示例相同的方式处理它。但似乎 CWG 缺陷记录中修改后的措辞不适用于此案例。内容如下:
If
T
is a class type and the initializer list has a single element of typecv T
or a class type derived fromT
, the object is initialized from that element.
http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1467
但在第二个代码示例中,初始化列表在技术上包含 const T &
.所以我不知道它是如何工作的,除非在聚合初始化失败后,我们应该尝试构造函数。
我错了吗?聚合初始化失败后是否不应该尝试构造函数?
这是一个相关的例子:
#include <iostream>
struct B {
int x;
operator int() const { return 2; }
};
int main() {
B b{1};
B c{b};
std::cout << c.x << std::endl;
}
在clang-3.6
, gcc-4.8
, gcc-4.9
, 它打印 2
,并在 clang-3.7
, gcc-5.0
它打印 1
.
假设我错了,并且在 C++11 标准中,聚合的列表初始化应该是聚合初始化而不是别的,直到引入缺陷报告中的新措辞,这是否是一个错误发生即使我选择 -std=c++11
在较新的编译器上?
最佳答案
When the standard writes,
"If X, foo-initialization is performed. Otherwise, if Y, bar-initialization is performed, .... Otherwise, the program is ill-formed.",
doesn't this mean that if X holds, but foo-initialization cannot be performed, then we should check if Y holds, and then attempt bar-initialization?
不,它没有。把它想象成实际的代码:
T *p = ...;
if(p)
{
p->Something();
}
else
{ ... }
p
不是 NULL。这也不意味着它是一个有效的指针。如果 p
指向一个被销毁的对象,p->Something()
失败不会导致您跳到 else
。您有机会在这种情况下保护通话。
所以你会得到未定义的行为。
这里也是一样。如果 X,则执行 A。这并不意味着如果 A 失败会发生什么;它告诉你去做。如果做不到……你就完蛋了。
关于c++ - 列出聚合的初始化 : when can it invoke copy constructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005700/
如何将 jQuery 代码转换为 React JS? 我有一个带有文本“复制”的按钮。当我单击它时,应将其文本更改为“已复制”并复制到剪贴板。复制后,几秒钟后我希望文本返回到“复制”。我相信以下功能将
在任何情况下我都想使用 NumPy 的 np.copy() 而不是 Python 的 copy.copy() 方法?据我所知,两者都创建浅拷贝,但 NumPy 仅限于数组。 NumPy 是否有任何性能
%python -m timeit -s "import copy" "x = (1, 2, 3)" "copy.deepcopy(x)" 100000 loops, best of 3: 10.1
我想制作一个列表的副本(字面意思是一个单独的克隆,与原始列表没有任何共享)。我使用了 copy.copy() 并创建了 2 个单独的列表,但为什么每个副本的元素似乎仍然共享? 这很难解释,请查看以下输
我不明白使用通配符时 COPY 命令的行为。 我在 C:\Source 中有一个文本文件叫 mpt*.asm我想把它复制到 C:\Dest .这是批处理脚本所需要的,我不能确定 mpt*.asm 的确
相关但不等同于:Golang: How to copy Context object without deriving 是否可以推导出 context.WithTimeout来自 context.Ba
您可以实现 Copy 特性来为类型提供复制语义而不是 move 语义。仅当其所有组成元素(产品类型的每个因素,或总和类型的每个变体的每个因素)也都是复制时,才能执行此操作。 这还允许您制作相当大的类型
我有一段代码,我需要确定编码值的类型,但我不知道它是字符串、无符号整数还是字符串的矢量。我想做以下几件事:。然而,来自弯曲板条箱的值不能实现复制,它在调用Decode_Bencode_Object之后
我需要复制一些对象,我读到 copy.copy 模块可以在 Python 上执行此操作。问题是,这些对象有一些属性是长数组。 那么这个方法效率高吗?由于性能在我所做的这项工作中很重要。 有更好的方法吗
我尝试高效地制作 lua 表的副本。我编写了以下运行良好的函数 copyTable()(见下文)。但我想我可以使用函数的“按值传递”机制获得更高效的东西。我做了一些测试来探索这个机制: functio
使用 pry 插件:pry-clipboard 当我输入“copy-history”来复制我历史的最后一行时,它实际上是在复制“copy-history”并粘贴“copy-history”。 我是不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve this
我不了解Kotlin中通过访问器处理字段和复制方法之间的区别。就像这样: 访问者示例: class Person(val name: String, var age: Int
如何从节点复制一些属性。例如。我只想从节点“Extn”复制“Srno”,“RollNo”,“right”。
我有以下两个 XSL 转换,我希望将它们链接到一个 XSL 文件中。 第一次转换: 第二个转换(使用第一个转换的输出作为输入): 我的目标是从 WSDL
我是 Vertica DB 的新手,之前使用过 Mysql。我想在 vertica 表中插入唯一记录,但 vertica 在插入时不支持唯一约束。我通过 COPY 查询在表中插入记录。所以我无法在插入
std::copy 与执行策略参数之间是否存在正式关系?无论是在实践中还是在标准中。 例如,会不会只是这样, namespace std{ template It copy(std::
我用 root 运行了以下命令来备份同一主机上的文件夹:cp -r master 主备 size of master : 76GB size of master-backup : 71GB 知道为什么
我遇到过一段代码,乍一看似乎毫无意义。但我意识到这可能会产生一些我不知道的未知含义,因为 Python 不是我最熟悉的语言。 import copy node = copy.copy(node) 阅读
我正在设计一个基类,我希望它为 copy.copy 定义基本行为。此行为包括在控制台中打印警告,然后复制实例,就好像它没有 __copy__ 一样。属性。 当定义一个空白时Foo类并复制它的一个实例,
我是一名优秀的程序员,十分优秀!