gpt4 book ai didi

c++ - 如果模板化,g++ 不会调用复制构造函数吗?

转载 作者:太空狗 更新时间:2023-10-29 20:35:46 25 4
gpt4 key购买 nike

tl;dr: 如果复制构造函数前面有 template<typename Something>,则不会调用它,那Something在构造函数签名中使用。


概念验证(ideone):

#include <cstdio>

template<typename T>
class Test {
private:
T value_;

public:
mutable bool has_copies;

Test(const T& value) : value_(value), has_copies(false) {}

template<typename Related> // remove template here to fix behavior
Test(const Test<Related>& t) {
printf("In copy constructor\n");
value_ = t.value_;
has_copies = true;
t.has_copies = true;
}
};

int main() {
Test<int> t1(42);
printf("Before constructor\n");
Test<int> t2(t1);
printf("After constructor:\n");
printf(" t1 thinks it %s copies\n", t1.has_copies ? "has" : "doesn't have");
printf(" t2 thinks it %s copies\n", t2.has_copies ? "has" : "doesn't have");
}

输出:

Before constructor
After constructor:
t1 thinks it doesn't have copies
t2 thinks it doesn't have copies

注意如何 In copy constructor未打印。

使复制构造函数成为非模板(即删除 template<typename Related> 并将签名中的 Related 更改为 T)为我解决了这个问题。

$ g++ --version
g++ (GCC) 6.2.1 20160830

编译&执行命令:

g++ -Wall -Wextra -pedantic -std=c++11 -O2 -Wshadow -Wformat=2 -Wfloat-equal -Wconversion -Wlogical-op -Wcast-qual -Wcast-align -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -D_FORTIFY_SOURCE=2 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -fstack-protector "test.cpp" -o "test" && "test"

这是怎么回事?

最佳答案

函数模板永远不能是复制构造函数,即使实例化的类型显然会使其与复制构造函数的预期签名相匹配。参见 [class.copy/2]:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments.

所有类都有一个隐式生成的复制构造函数,如果没有用户声明的复制构造函数(有时这可能被定义为已删除),带有签名:

Test(Test const &) = default;

当你写 Test<int> t2(t1); ,重载决策选择复制构造函数而不是模板函数,因为在所有其他条件相同的情况下,非模板优于模板。

请注意,如果您将模板函数更改为 Test(Test<Related>& t)然后它现在将在复制构造函数上被选择:“所有其他事物”不再相等,并实例化模板以完全匹配 Test<int>优于转换添加 const匹配复制构造函数。

关于c++ - 如果模板化,g++ 不会调用复制构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301384/

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