gpt4 book ai didi

c++ - 使用模板赋值运算符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:11 26 4
gpt4 key购买 nike

有以下代码,为什么第一个赋值不调用 Foo 中的模板 operator=,而第二个赋值呢?这里发生了什么?即使存在用户定义的模板,是否有编译器为第一次赋值生成模板?

#include <iostream>

using namespace std;

struct UberFoo { };

struct Foo : public UberFoo
{
template<typename T> void operator=(const T& v) { cout << "const T&" << endl; Set(v); }
template<typename T> void operator=(T& v) { cout << "T&" << endl; return Set(v); }

virtual void Set(const Foo&) { cout << "Foo::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Foo::Set(const UberFoo&)" << endl; }
};

struct Bar : public Foo
{
virtual void Set(const Foo&) { cout << "Bar::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Bar::Set(const UberFoo&)" << endl; }
};

int main()
{
Bar a, b;

Foo & pa = a;
const Foo& rb = b;
const UberFoo & urb = b;

cout << "First" << endl;

pa = rb;

cout << endl << "Second" << endl;

pa = urb;

return 0;
}

最佳答案

编译器仍在生成第一个赋值绑定(bind)到的非模板 operator=。在第二个作业中,模板化的 operator= 是一个更好的候选者(因为它不涉及转换),因此选择了一个。

您可以通过在代码中添加以下内容来查看:

Foo& operator=(const Foo&) = delete;

或者强制正确的模板调用:

pa.operator=<Foo>(b);

The standard说(强调我的):

12.8 复制和移动类对象,§12.8/17,第 271 页:

A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile X&

§12.8/18,同一页:

If the class definition does not explicitly declare a copy assignment operator, one is declared implicitly.

关于c++ - 使用模板赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24286523/

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