范围解析运算符被使用了两次

Posted

技术标签:

【中文标题】范围解析运算符被使用了两次【英文标题】:Scope resolution operator being used twice 【发布时间】:2017-11-30 13:50:34 【问题描述】:
namespace libzerocoin 

//Commitment class
Commitment::Commitment::Commitment(const IntegerGroupParams* p,
                               const Bignum& value): params(p), contents(value) 
this->randomness = Bignum::randBignum(params->groupOrder);
this->commitmentValue = (params->g.pow_mod(this->contents, params->modulus).mul_mod(
                         params->h.pow_mod(this->randomness, params->modulus), params->modulus));

我刚刚在GitHub上遇到了这个函数定义。

我假设第二个和第三个“承诺”指的是类名和构造函数,但我无法弄清楚第一个的含义。我确信它没有引用命名空间,因为该名称不同。我已经看到在示例中使用了两次范围解析运算符,但它们指的是嵌套的命名空间。

【问题讨论】:

偶类 B B(); ; B::B::B::B() 使用 gcc 和 clang 编译,但 MSVC 存在问题。有趣的。也许注入类型。 【参考方案1】:

在 C++ 中,类具有将其名称注入其作用域 ([class]/2) 的特性:

class-name 也被插入到类本身的作用域中; 这被称为 injected-class-name。出于访问目的 检查,injected-class-name 被视为公共的 会员名。

您展示的代码 sn-p 使用了它。在某些情况下Commitment::Commitment 命名类本身,而在其他情况下命名 c'tor。只有最后一个Commitment((您打开括号的位置)开始了 c'tor 定义。

而且看起来更糟:

struct foo 
    foo();
;

foo::foo::foo::foo() = default;

您可以看到有效的 C++ Live

【讨论】:

这个奇怪功能的目的是什么? @DevNull - 我敢打赌这是为了平滑通用代码的某些锐利边缘。但老实说,我从来没有偶然发现它。

以上是关于范围解析运算符被使用了两次的主要内容,如果未能解决你的问题,请参考以下文章

一个Dubbo服务方法被连续调用了两次,这是怎么回事

点运算符和范围解析运算符有啥区别

C语言实现一个int类型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数字

C++0x decltype 和范围解析运算符

范围解析运算符 :: 与成员访问运算符 。在 C# 中

范围解析运算符语义