gpt4 book ai didi

c++ - 将 make_shared 与构造函数一起使用时出现 gcc 4.7.3 内部编译器错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:44 26 4
gpt4 key购买 nike

我明白问题出在哪里,我只是不确定为什么我没有从 gcc 得到任何错误输出。

产生问题的行是:

std::string type,rel,pred;
std::tie( type, rel, pred ) = tuple;
auto supertype = std::make_shared<Node>( Token( type ) ); // This
auto predicate = std::make_shared<Node>( Token( pred ) ); // and this

仅供引用,Node Ctor 是:

Node ( Token & token )

如果我这样做,我不会收到任何错误:

auto type_token = Token( type );
auto pred_token = Token( pred );
auto supertype = std::make_shared<Node>( type_token );
auto predicate = std::make_shared<Node>( pred_token );

我的 GCC 是:

posix gcc version 4.7.3 (Debian 4.7.3-8)

实际错误是:

> Internal compiler error: Error reporting routines re-entered. Please
> submit a full bug report, with preprocessed source if appropriate. See
> <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.

有趣的是,上面的目录根本不存在。

在 make_shared 构造函数中构造对象有什么问题?

最佳答案

临时对象不能绑定(bind)到非const 左值引用。因此,您不能将一个传递给指定的 Node 构造函数。编译器应该拒绝:

Node node1(Token(type));
Node node2(Token(pred));

尝试让 std::make_shared 使用您的代码在内部执行相同的初始化也是如此:

auto supertype = std::make_shared<Node>( Token( type ) );
auto predicate = std::make_shared<Node>( Token( pred ) );

您正在尝试让 make_shared 将该临时对象传递给非 const 左值构造函数。编译器应该将程序诊断为格式错误并且无法编译它。这显然与 ICE 崩溃不同,ICE 总是表明存在编译器错误。

解决方法是按照您在“但这确实有效”代码中的建议进行操作 - 将左值引用传递给 make_shared - 或者为 Node 编写右值引用构造函数>:

Node(Token&&);

编辑:我认为这是 GCC bug# 56869似乎已在 4.6.4 和 4.7.4 中修复并于 2013-11-18 关闭。如果任何阅读本文的人都可以轻松地在 4.7.4 中运行这个测试用例:

#include <memory>
#include <string>

struct Token {
Token(std::string lex);
};

struct Node {
Node(Token& token);
};

int main() {
auto supertype = std::make_shared<Node>(Token{"foo"});
auto predicate = std::make_shared<Node>(Token{"bar"});
}

请在评论中发布结果。

关于c++ - 将 make_shared 与构造函数一起使用时出现 gcc 4.7.3 内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277669/

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