下面的例子初始化一个std::array <char, N>
构造函数中使用字符串文字的成员不能在 GCC 4.8 上编译,但可以使用 Clang 3.4 编译。
#include <iostream>
#include <array>
struct A {
std::array<char, 4> x;
A(std::array<char, 4> arr) : x(arr) {}
};
int main() {
// works with Clang 3.4, error in GCC 4.8.
// It should be the equivalent of "A a ({'b','u','g','\0'});"
A a ({"bug"});
for (std::size_t i = 0; i < a.x.size(); ++i)
std::cout << a.x[i] << '\n';
return 0;
}
第一印象它看起来像一个 GCC bug。我觉得它应该编译,因为我们可以初始化std::array<char, N>
直接使用字符串文字。例如:
std::array<char, 4> test = {"bug"}; //works
我很想知道标准对此有何规定。
是的,您的代码有效;这是海湾合作委员会的一个错误。
这是一个更简单的程序,演示了该错误(我已替换std::array<char, 4>
with S
并摆脱了A
,我们可以在函数返回中演示该错误(这使得分析更简单,因为我们不必担心构造函数重载):
struct S { char c[4]; };
S f() { return {"xxx"}; }
这里我们有一个类型的目标对象S
那是复制初始化(8.5p15) 来自大括号初始化列表 {"xxx"}
,所以物体是列表初始化(8.5p17b1)。S
是聚合 (8.5.1p1),因此执行聚合初始化 (8.5.4p3b1)。在聚合初始化中,成员c
is 复制初始化从相应的初始化子句 "xxx"
(8.5.1p2)。我们现在返回到 8.5p17,目标对象类型为char[4]
并初始化字符串文字"xxx"
,所以 8.5p17b3 引用了 8.5.2 以及char
数组由字符串的连续字符初始化 (8.5.2p1)。
请注意,gcc 可以很好地进行复制初始化S s = {"xxx"};
同时打破各种形式的复制和直接初始化;参数传递(包括构造函数)、函数返回以及基类和成员初始化:
struct S { char c[4]; };
S f() { return {"xxx"}; }
void g(S) { g({"xxx"}); }
auto p = new S({"xxx"});
struct T { S s; T(): s({"xxx"}) {} };
struct U: S { U(): S({"xxx"}) {} };
S s({"xxx"});
最后一个特别有趣,因为它表明这可能与错误 43453 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)