gpt4 book ai didi

c++ - f-noelide-constructors 未按预期工作

转载 作者:行者123 更新时间:2023-11-30 02:22:43 26 4
gpt4 key购买 nike

我已经关注了这个程序。

#include <iostream>

using namespace std;

template<class t> class myclass
{
private:
t x;
t y;

public:
myclass(t a, t b);
t get_max();
};

template<class t> myclass<t>::myclass(t a, t b)
{
x = a;
y = b;
}

template<class t> t myclass<t>::get_max()
{
if(x > y)
return x;
else
return y;
}

int main()
{
myclass<int> obj = myclass<int>(2, 3);
cout << "max : " << obj.get_max() << endl;
}

由于以下原因,我显式调用了 myclass obj = myclass(2, 3) 而不是 myclass obj(2, 3) 来查看编译失败

1) I defined one constructor which will take 2 parameters and there is no default constructor which will take 0 parameters.
2) I compiled with f-noelide-constructors which shouldn't do any optimization related to constructors.

在这种情况下,应该使用默认构造函数创建一个对象,并且应该使用 myclass(2, 3) 复制构造该对象,并且编译器无法看到默认构造函数,编译应该会失败。但程序运行良好。谁能告诉我是否有任何原因导致未调用默认构造函数。

最佳答案

myclass<int> obj = myclass<int>(2, 3);

在这条线上,myclass<int>是从一个临时的 myclass<int> 移动构建的,使用自动生成的移动构造函数。

你可以看到这是通过故意阻止编译器生成移动构造函数而发生的,方法是放置一行

myclass(myclass&&) = delete;

myclass定义,并观察产生的错误。

但这在任何时候都不需要 myclass默认构造——右侧的临时构造函数使用双参数构造函数构造,移动构造发生在之后的一步——像这样使用移动(或复制)构造函数与默认构建 obj然后是复制/移动分配。

编辑:以上内容适用于 C++11 和 14。如果您使用的是早期版本的 C++,obj将复制构造而不是移动构造,但同样适用——在任何时候都不需要调用默认构造函数。

在 C++17 中,guaranteed copy elision意味着 obj将像您所说的那样构造 myclass<int> obj(2, 3)直接,即 -fno-elide-constructors不会有任何影响。 (感谢 Guillaume Racicot 的提醒。)

关于c++ - f-noelide-constructors 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com