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

标签 c++ gcc c++11 constructor shared-ptr

我明白问题出在哪里,我只是不确定为什么我没有从 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

仅供引用,节点 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 );

我的海湾合作委员会是:

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 左值引用。因此,您无法将 1 传递给指定的 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 崩溃不同,后者总是表明存在编译器错误。

解决方法是按照您在“但这确实有效”代码中的建议进行操作 - 将左值引用传递给 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/

相关文章:

c++ - 在 CLI 中抛出 std::exception 会抛出访问冲突

c++ - 自动和复制构造函数 : what's wrong?

编码标准 : variable initialization

c++ - 为什么编译器不能推导模板模板参数?

c++ - 函数签名作为模板参数

c++ - 包装在 C++/CLI 中使用 native 接口(interface)的 native C++ 代码

Python/C++ 绑定(bind),如何将静态 C++ 库 (portaudio) 与 distutils 链接起来?

c++ - OpenGL 天空盒不显示

c - K&R函数声明

c++ - 如何使用模板推导 std::function 的参数类型?