C++ 在C++;

C++ 在C++;,c++,function,operator-keyword,C++,Function,Operator Keyword,另一方面,这也适用于: int a, b, c; //do stuff. For e.g., cin >> b >> c; c = a + b; //works c = operator+(a,b); //fails to compile, 'operator+' not defined. 甚至可以直接调用基本类型(如int)的运算符+(和其他运算符)吗 如果是,如何进行 如果没有,有C++的引用语句,这说明这是不可行的吗?李> 来自 我

另一方面,这也适用于:

int a, b, c; 

//do stuff. For e.g., cin >> b >> c; 

c = a + b;          //works 
c = operator+(a,b); //fails to compile, 'operator+' not defined. 
  • 甚至可以直接调用基本类型(如int)的运算符+(和其他运算符)吗
  • 如果是,如何进行
  • <>如果没有,有C++的引用语句,这说明这是不可行的吗?李>
来自

我可以定义一个与内置/内在/基本类型一起工作的操作符重载吗? <>不,C++语言要求 您的运算符重载至少需要 “类类型”的一个操作数或 枚举类型。C++语言 不允许您定义运算符 其操作数/参数均为 基本类型的

例如,您不能定义 运算符==接受两个字符*s和 使用字符串比较。很好 新闻,因为如果s1和s2是类型 char*,表达式s1==s2已存在 有一个明确的含义:它 比较两个指针,而不是两个指针 这些指针指向的字符串。 无论如何,你不应该使用指针。使用 std::string而不是char*

<>如果C++允许你重新定义 内置类型上的运算符,您可以 永远不知道1+1是什么:它 将取决于得到的标题 是否包括其中一项 标题重新定义,添加到平均值, 例如,减法

C++标准{5.5.6 运算符函数应为非静态成员函数或非成员函数,且至少具有一个类型为类、类引用、枚举或枚举引用的参数。无法更改运算符的优先级、分组或操作数。通过定义实现这些运算符的运算符函数,可以为特定类和枚举类型更改为每种类型预定义的运算符=、(一元)和(逗号)的含义。运算符函数以与其他基类函数相同的方式继承


首先,将内置操作符作为函数调用不会简单地起作用,因为语言规范从未说过这样的函数存在。内置操作符就是操作符。它们背后没有实现函数,只是因为语言规范从未暗示它们的存在。基于函数的实现只针对重载运算符

第二,在重载解析过程中,内置运算符实际上由其类似于虚函数的对应项表示,但禁止“显式”调用内置运算符的措辞在13.6/1中出现

候选运算符的功能是 表示内置运算符 第5条中的定义在 本款。这些候选人 函数参与到操作符中 过载解析过程为 如13.3.1.2所述,使用 无其他用途


我很好奇,你为什么要这么做?我正在尝试帮助别人学习C++,我在谈论操作符的行为就像函数。我想展示一段称为运算符+(2,3)而不是2+3的代码,以说明当我意识到它没有像我预期的那样工作时的想法。我理解这一点。我并不是在试图重载一个基本运算符。我只是试图通过调用基本运算符的函数运算符名来调用它。@Vatsan:
运算符函数应该是非静态成员函数或非成员函数,并且至少有一个类型为类、类引用、枚举的参数,或者引用枚举。
-这是一个非常明确的要求。很明显,禁止我声明不符合这些要求的新运算符函数。它没有告诉我为什么我不能使用运算符函数语法来调用一个基本运算符,它恰好作为语言的一部分存在。@Vatsan:我认为它不存在,除非你显式声明它,并且你不能为非类类型声明它。这是有意义的。我暗自希望标准中有一些要求,即只禁止重新定义基元运算符,但调用语法对所有基元运算符都是一样的,因为它只是语法上的糖分,除了可读性之外,不会对任何东西产生明显的影响。谢谢正是我想要的。谢谢
class Foo
{
 int x; 
public:
 Foo(int x):x(x) {} 

 Foo friend operator+(const Foo& f, const Foo& g)
 {
  return Foo(f.x + g.x); 
 }

};    

Foo l(5), m(10); 

Foo n = operator+(l,m); //compiles ok!