Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述以下示例初始化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) {}};in 以下示例初始化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','
std::array<char,4> test = {"BUG"}; //works
'});" A a ({"BUG"}); for (std::size_t i = 0; i < a.x.size(); ++i) std::cout << a.x[i] << '\n'; return 0;}

在第一印象它看起来像一个GCC错误.我觉得它应该编译,因为我们可以初始化一个std :: array< char,N>直接用字符串文字.例如:

struct S { char c[4]; };S f() { return {"xxx"}; }

我有兴趣看看标准说明了什么.

解决方法 是的,你的代码是有效的这是gcc中的一个错误.

这是一个更简单的程序,它演示了这个错误(我已经用S替换了std :: array< char,4>和摆脱了A,因为我们可以在函数返回中演示错误(这使得分析更简单,因为我们不必担心构造函数重载):

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"});

这里我们有一个从braced-init-List {“xxx”}复制初始化(8.5p15)的类型S的目标对象,所以对象被列表初始化(8.5p17b1). S是聚合(8.5.1p1),因此执行聚合初始化(8.5.4p3b1).在聚合初始化中,成员c从相应的initializer子句“xxx”(8.5.1p2)进行复制初始化.我们现在返回到具有char [4]类型的目标对象的8.5p17,并初始化字符串文字“xxx”,所以8.5p17b3引用我们到8.5.2,并且char数组的元素由字符串的连续字符8.5.2p1).

请注意,复制初始化S s = {“xxx”},gcc很好同时打破各种形式的复制和直接初始化;参数传递(包括构造函数),函数返回,以及基础和成员初始化:

[+++]

最后一个特别有趣,因为它表明这可能与bug 43453有关.

总结

以上是内存溢出为你收集整理的c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?全部内容,希望文章能够帮你解决c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?_C_内存溢出

c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?

c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?,第1张

概述以下示例初始化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) {}};in 以下示例初始化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','
std::array<char,4> test = {"BUG"}; //works
'});" A a ({"BUG"}); for (std::size_t i = 0; i < a.x.size(); ++i) std::cout << a.x[i] << '\n'; return 0;}

在第一印象它看起来像一个GCC错误.我觉得它应该编译,因为我们可以初始化一个std :: array< char,N>直接用字符串文字.例如:

struct S { char c[4]; };S f() { return {"xxx"}; }

我有兴趣看看标准说明了什么.

解决方法 是的,你的代码是有效的这是gcc中的一个错误.

这是一个更简单的程序,它演示了这个错误(我已经用S替换了std :: array< char,4>和摆脱了A,因为我们可以在函数返回中演示错误(这使得分析更简单,因为我们不必担心构造函数重载):

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"});

这里我们有一个从braced-init-List {“xxx”}复制初始化(8.5p15)的类型S的目标对象,所以对象被列表初始化(8.5p17b1). S是聚合(8.5.1p1),因此执行聚合初始化(8.5.4p3b1).在聚合初始化中,成员c从相应的initializer子句“xxx”(8.5.1p2)进行复制初始化.我们现在返回到具有char [4]类型的目标对象的8.5p17,并初始化字符串文字“xxx”,所以8.5p17b3引用我们到8.5.2,并且char数组的元素由字符串的连续字符8.5.2p1).

请注意,复制初始化S s = {“xxx”},gcc很好同时打破各种形式的复制和直接初始化;参数传递(包括构造函数),函数返回,以及基础和成员初始化:

最后一个特别有趣,因为它表明这可能与bug 43453有关.

总结

以上是内存溢出为你收集整理的c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?全部内容,希望文章能够帮你解决c – 使用字符串字面值在构造函数中初始化std :: array成员. GCC错误?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1252885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存