我有以下SSCCE:
#include#include void foo(const std::string &a) { std::cout << a << std::endl; } template 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...]()
.但是,到目前为止,我认为这[&]
与逐个列出所有参数一样.
那么这里出了什么问题?
PS:这不仅限于此-O3
.-O0
不会发生段错误但不会返回预期的结果("Hello World!"):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out [:~/tmp] $
PPS:进一步降低SSCCE.现在我甚至都没有得到诊断-Wall -Wextra
了.
我强烈怀疑是一个g ++错误.
以下是一些注意事项:
替换std::string
为任何基本类型,例如,int
仍然不起作用
clang和VC++将按预期工作
不通过引用传递参数包导致g ++ 7.0.1内部编译器错误,输出如下:
内部编译器错误:在make_decl_rtl中,在varasm.c:1304
...
如果合适,请提交完整的错误报告,并提供预处理的来源.
请包含完整的回溯以及任何错误报告.有关说明,请参阅 http://gcc.gnu.org/bugs.html.