C++继承了运算符隐式转换



我有以下代码

#include <iostream>
#include <string>
class A : public std::string {
public:
A(int){};
};
int main() {
A a(5);
std::cout << (a == A(5)) << std::endl;
std::cout << (a == 5) << std::endl;
}

第一行工作,数字被显式转换为"0";A";然后使用来自CCD_ 1的比较运算符来比较对象。

我的问题是,我想避免显式转换,但如果我像第二行那样这样做,编译器就不会意识到隐式转换数字的可能性,也不会使用std::string比较。

有没有一种方法可以改变a类,使隐式转换/比较起作用?

我认为您可以使用用户定义的转换函数来解决问题。

在你的情况下,你可以这样做:

#include <iostream>
#include <string>
class A : public std::string {
public:
A(int i) : m_i { i } {};
operator int() const { return m_i; }
int m_i;
};
int main() {
A a(5);
std::cout << (a == A(5)) << std::endl;
std::cout << (a == 5) << std::endl;
}

但是请注意,正如注释中所指出的,您不应该从std::string派生。

最新更新