使用
-fno-elide-constructors
编译的这段代码应该打印“cctor”吗?
#include<iostream>
struct non_auto
{
non_auto()=default;
private:
non_auto(const non_auto&)
{std::cout << "cctor" << std::endl;}
};
non_auto foo()
{
return non_auto{};
}
int main()
{
auto z = foo();
}
事实证明,对于我尝试过的所有 GCC 版本,它都没有打印任何内容,并且有效地省略了构造函数。
https://godbolt.org/z/rPTbzzza8
我错过了什么?即使使用此选项,是否仍可能发生省略?
更新:我正在使用C++17,似乎在C++14中可以工作,但它不是很有趣,因为我试图用这个标志在C++17中重现C++14的行为。
查看 gcc 文档:
在 C++17 中,编译器需要忽略这些临时变量,但此选项仍然会影响琐碎的成员函数。
我不知道成员函数需要多“微不足道”才会受到影响,但由于您是在非成员函数中创建对象,所以这个问题没有实际意义。当针对 C++17 或更高版本进行编译时,此标志基本上无效。