gpt4 book ai didi

c++ - 为什么 C++ 运算符重载需要 "having at least one parameter of class type"?

转载 作者:行者123 更新时间:2023-12-03 17:50:08 25 4
gpt4 key购买 nike

“C++ 入门第 5 版”的第 14.1 章内容如下:

An operator function must either be a member of a class or have at least one parameter of class type.



例如, string("hello")+"world"编译 "hello"+"world"没有。当我想重载 +在两个 C 弦上。
std::string operator+ (const char* s1, const char* s2)

我收到以下错误。

error: ‘std::string operator+(const char*, const char*)’ must have an argument of class or enumerated type



我有两个问题。
  • 这个限制是语言规范的一部分吗? 如果是,为什么 C++ 设计者想要这样做?
  • std::string有像 string (const char* s); 这样的构造函数,这意味着编译器可以从 char* 进行隐式类类型转换至string .当我们调用 "hello"+"world" , 为什么编译器不转换这两个 char* "s 到两个字符串? 毕竟,在两个 std::strings 上有一个重载的 "+"。string operator+ (const string& lhs, const string& rhs);
  • 最佳答案

    Is this restriction part of the language specification? If yes, why C++ designers want to do that?



    是的。引自 N3337 , §13.5.6 [over.oper]:

    An operator function shall either be a non-static member function or be a non-member function and have at least one parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.



    关于“为什么”部分,因为删除此要求意味着您可以重载内置类型的运算符,这些类型已经定义了它们的运算符语义。这是完全不可取的事情。

    例如,你认为定义这个有意义吗?
    int operator+(int a, int b) { return a - b; }

    它是否允许更多人在阅读您的代码时对您的程序进行推理,或者仅仅是一些令人惊讶的事情有效地破坏了您的推理?

    如果我们在游戏中获得指针会发生什么?
    bool operator==(const char *str1, const char *str2) { 
    return strcmp(str1, str2) == 0;
    }

    你会期待 operator==现在取消引用内存?我不会。令人惊讶。这违背了标准已经对这些运营商所说的内容。它打破了过去 25 年中每个 C 程序的行为方式。语言不应该让你做这种滥用。

    关于c++ - 为什么 C++ 运算符重载需要 "having at least one parameter of class type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23505423/

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