gpt4 book ai didi

c++ - 在模板类上调用的析构函数过多 (N)RVO 优化

转载 作者:太空狗 更新时间:2023-10-29 20:24:14 26 4
gpt4 key购买 nike

我正在尝试编写自己的智能指针 (C++11) 并遇到一个问题,这可以通过下一个示例来解释:

#include <iostream>

template<typename T_Type>
class TestTemplateClass {
private:
T_Type _state;

public:
TestTemplateClass() : _state() {
std::cout << "Default constructor" << std::endl;
}

TestTemplateClass(int inState) : _state(inState) {
std::cout << "State constructor" << std::endl;
}

template<typename T_OtherType>
TestTemplateClass(const TestTemplateClass<T_OtherType> &inValue) {
std::cout << "Template-copy constructor" << std::endl;
}

template<typename T_OtherType>
void operator = (const TestTemplateClass<T_OtherType> &inValue) {
std::cout << "Operator" << std::endl;
}

~TestTemplateClass() {
std::cout << "Destructor" << std::endl;
}
};

TestTemplateClass<int> createFunction() {
return TestTemplateClass<int>();
}

int main() {
TestTemplateClass<int> theReference = createFunction();
std::cout << "Finished" << std::endl;
return 0;
}

输出:

Default constructor
Destructor
Destructor
Finished
Destructor

如您所见,这里有很多析构函数。在我看来,复制省略和模板构造函数之间的交互存在一些问题,但我不知道这种错误的原因可能是什么。我试图通过添加 explicit 复制构造函数并强制编译器使用我的模板构造函数来解决这个问题:

// After TestTemplateClass(int inState), but it's not important
explicit TestTemplateClass(const OwnType &inValue) {
std::cout << "Copy constructor" << std::endl;
}

得到下一个输出:

Default constructor
Template-copy constructor
Destructor
Template-copy constructor
Destructor
Finished
Destructor

这一切看起来都不错,但它看起来不像是一个干净的解决方案。有更好的选择吗?

最佳答案

(N)RVO 可以永远在构造函数和析构函数调用的数量之间引入差异。它旨在使这基本上成为不可能。

问题出在您的代码上。根据语言规则,构造函数模板永远不会用于生成复制构造函数。复制构造函数永远不是模板,句号。

所以你的类模板实际上并没有声明一个复制构造函数,因此编译器生成默认的(当然不会打印任何东西)。如果你需要在复制构造函数中进行任何特殊处理,你必须始终手动声明它。永远不会使用模板来实例化一个模板。

关于c++ - 在模板类上调用的析构函数过多 (N)RVO 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29004316/

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