gpt4 book ai didi

c++ - 模板化赋值运算符和自检

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:55 25 4
gpt4 key购买 nike

我正在阅读一本关于模板编程的书,其中一个示例中有代码在模板赋值运算符中进行自检。基本上它类似于以下内容:

template <typename T>
class Foo
{
public:

template <typename O>
Foo<T> operator= (const Foo<O> & other)
{
if ((void *)this == (void *)&other)
{
std::cerr << "success" << std::endl;
}
else
{
std::cerr << "failure" << std::endl;
}
return *this
}
};

现在,根据我的理解,由于模板赋值运算符不会阻止生成默认赋值运算符,因此对于 O = T 的情况,将始终选择默认赋值运算符而不是模板版本。也就是说,在这种情况下,O = T 永远不会出现。

我想知道我的理解是否正确。如果是,是否存在某种棘手的层次结构(例如,如果我从其他东西派生 Foo 或者它是否从其他东西派生),赋值运算符将打印出“成功”?

我已经尝试了几件事,但我真的做不到。

提前致谢

最佳答案

要么你是对的,要么 MSVC 11 和 g++ 4.7.1 都错了。

即,通常不会调用模板赋值运算符:将调用自动生成的复制赋值运算符。

输出“成功”,这样做,并希望编译器使用空基类优化(EBO):

#include <iostream>

template <typename T>
class Foo;

template<> class Foo<void> {};

template <typename T>
class Foo: public Foo< void >
{
public:

template <typename O>
void operator=( const Foo<O> & other )
{
if ((void *)this == (void *)&other)
{
std::cerr << "success" << std::endl;
}
else
{
std::cerr << "failure" << std::endl;
}
}
};

int main()
{
Foo<int> a, b;

Foo<void>& v = a;
a = v;
}

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

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