我有以下SSCCE:
#include <iostream>
#include <string>
void foo(const std::string &a) {
std::cout << a << std::endl;
}
template <typename... Args>
void bar(Args &&... args) {
[&]() {
[&]() {
foo(args...);
}();
}();
}
int main() {
const std::string x("Hello World!");
bar(x);
}
在clang ++(3.9.1)下,这会编译并发出“Hello World”。 Gcc 6.3在-O3
下失败并出现分段错误。
我可以通过显式传递指针和引用包来解决问题,将[&]()
替换为[&args...]()
。但是,到目前为止,我认为[&]
会像逐个列出所有参数一样。
那么这里出了什么问题?
P.S:
这不仅限于-O3
。 -O0
不会出现段错误,但不会返回预期结果(“Hello World!”):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S:进一步降低了SSCCE。现在我甚至不再使用-Wall -Wextra
进行诊断。
答案 0 :(得分:9)
我强烈怀疑 g ++ bug 。
以下是一些注释:
std::string
替换为任何基本类型,例如int
still does not work 内部编译器错误:在make_decl_rtl中,在varasm.c:1304
...
请 提交完整的错误报告,如果适用,请提供预处理的来源。
请包含完整的回溯以及任何错误报告。看到 http://gcc.gnu.org/bugs.html获取指示。