考虑下面的例子:
class X;
void f(const X &);
void g()
{
X x;
f({x});
}
标准是否要求在这种情况下忽略花括号?没有任何优化的情况下。如果是,那么是从哪个版本开始?
乍一看,按规则应该创建一个完全不必要的临时对象,但仍然会创建。查看列表初始化(list initialization)并未找到相关信息。这里的X
不是聚合体。
使用-O0
选项编译,无论是否存在可观测副作用的X
复制构造函数或X
具有X(std::initializer_list<X>)
构造函数,GCC和Clang都会生成没有创建临时对象的代码。