【问题标题】:Shouldn't the Postfix Operators be Considered Binary Operators后缀运算符不应该被视为二元运算符吗
【发布时间】:2016-05-05 11:57:22
【问题描述】:

后缀运算符采用int 参数。已经有question as to why了,好像答案是:“Because Bjarne Stroustrup said so

我对这个答案感到不舒服。如果 Bjarne Stroustrup 需要一些东西来提示编译器以使其行为不同,为什么他不能直接关闭运算符是否返回引用?这让我产生疑问:

  1. 为什么我做不到:foo++ 13;
  2. 为什么int参数不默认为1
  3. 为什么这被认为是一元运算符,它需要一个参数

【问题讨论】:

    标签: c++ standards unary-operator binary-operators postfix-operator


    【解决方案1】:

    如果 Bjarne Stroustrup 需要一些东西来提示编译器以改变行为,他为什么不能直接关闭操作符是否返回引用?

    因为您不能根据返回类型重载函数。函数可以被重载的是参数、const限定和引用限定

    为什么我做不到:foo++ 13;

    因为(int) 参数只是为了解决重载问题。你不接受它或使用参数。

    为什么int参数不默认为1

    再次没有使用它。它只是告诉编译器它是前缀还是后缀版本。

    为什么这被认为是一元运算符,它需要一个参数

    它实际上不需要争论。该参数只是为了使它们不同。它只影响和作用于一个操作数,因此它是一元运算符。

    【讨论】:

    • 短版:这是一个 hack。
    • 你在玩硬币的两面:1)“因为你不能根据它的返回类型重载一个函数”你是说该方法必须遵循传统规则 2)“因为(int) 参数只是用于重载解析。你不要接受它或使用该参数。您是说该方法不必遵循传统规则。我的意思是,如果它无论如何都会违反规则,至少它应该是有意义的。
    • @JonathanMee 语言中没有办法告诉编译器 operator++ 应该是前缀还是后缀运算符。他们决定使用重载决议来破解它。他们决定将参数作为编译器的标记,而不是为处理返回值制定特殊规则。它与 C++ 的工作方式一样自然。事实上,我们在其他地方也使用丢弃的参数来消除编译器重载的歧义。
    • 啊!其他地方也一样!这就像我抓不到的痒。声明一个接受int 参数的函数......但不接受任何东西,这违反了规则。我想我只需要接受它并继续前进>:-[
    • @JonathanMee 是的。这只是其中一种情况,他们没有为返回类型创建新的关键字或特殊规则,而是决定使用内置的重载解析机制并放弃存在未使用参数的事实。
    【解决方案2】:

    回答标题中的问题:在foo++ 中,++ 显然是一元运算符。如果您仔细观察它,它的实现可能看起来像一个二元运算符这一事实并不会改变它的使用方式,这就是使它成为一元的原因。

    【讨论】:

    • 所以I asked NathanOliver这个也是,但是如果它的使用方式不符合规则,为什么它的检测方式必须如此呢?为什么我们不能为这样一个异常的运算符关闭返回类型?
    • 这根本不是异常。 int i = 0; i++;my_type foo; foo++;。在这两种情况下,++ 都是一元运算符。这是一致且有用的; “使用方式”在这两种情况下都是一样的。
    • 异常的是my_type& operator+=(int);是二元运算符,my_type operator++(int);是一元运算符。
    • 你看错了望远镜的一端。运算符是一元还是二元取决于它在源代码中的使用方式,而不是它的实现方式。在my_type foo; foo++; 中,++ 是一元运算符因为它对单个值进行操作。在my_type foo; foo += 3; 中,+= 是二元运算符,因为它对两个值进行运算。
    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2014-11-18
    • 2018-01-18
    • 2022-11-24
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多