我认为 ::
运算符在访问全局范围的情况下可以是一元的。在所有其他情况下,::
被视为二元运算符,::
运算符的评估规则在 N1::N2::N3 的情况下::n
等同于以下内容:
((N1::N2)::N3)::n // Error: ::n has not been declared
但该行无法编译。它很好奇。标准中没有关于 nested-name-specifier
评估的任何信息。如果 nested-name-specified
的求值等同于 qualified/unqualified-id
是很自然的,但它并没有在标准中的任何地方说明这一点。 那么我们是否可以假设 nested-name-specifier
的计算是依赖于实现的?
最佳答案
在[expr.prim.general]
(5.1.1/8-9)::
的解析规则被列为。它需要 ::
后跟命名空间/类的名称或命名空间/类的成员的名称。 (
和 )
不允许。
更具体地在[over.oper]
(13.5/1) 标准定义operator-function-id
和 operator
作为new
之一, delete
, +
, -
, !
, =
, ˆ=
, &=
, <=
, >=
, ()
, []
, new[]
, *
, <
, |=
, &&
, delete[]
, /
, >
, <<
, ||
, %
, +=
, >>
, ++
, ˆ
, -=
, >>=
, --
, &
, *=
, <<=
, ,
, |
, /=
, ==
, ->*
, ∼
, %=
, !=
, ->
.
.
, .*
, ::
, ?:
在第 9 条中被命名为不作为普通一元或二元运算符的异常(exception)。
关于c++ - C++ 中::运算符的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016605/