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