通过使用[x,y,z,...] - 子句语法,不允许运算符[]接受多个参数吗?

时间:2017-05-06 20:10:03

标签: c++ operator-overloading c++17 square-bracket

从C ++ 11开始,我们可以编写lambdas,例如:

auto foo = [a, b]() { return a+b; };

带有方括号的捕获子句,其中的项目用逗号分隔。在C ++ 17中,我们将能够使用结构化绑定:

for (const auto& [name, description] : planet_descriptions) {
    std::cout << "Planet " << name << ":\n" << description << "\n\n";
}

这是逗号分隔的方括号子句的另一个例子。

然而,我们无法覆盖一个班级&#39; operator[]取几个参数,例如这样:

template<typename V, typename I, typename J>
const V& operator[](I i, J j) const {
    return data_[width() * i + j];
}

https://github.com/tgdwyer/WebCola/wiki/link-lengths

我知道有一些解决方法 - 很多都在这里提到:

not compile

但是 - 为什么这种语言的前一部分,而后者不可能,甚至作为程序员自由裁量权的过载?是因为没有人提出其他建议,还是有某些具体原因呢?

备注:

  • 是的,当然这会在调用一元operator[]时使用逗号运算符产生歧义/不兼容性:x[a, b]可能是operator[](operator,(a,b))operator[](a,b)。但是,我们在圆括号中有一些相同的含糊之处:foo(a,b)可能是对foo()a的二元b的调用,或者它可能是{{} 1}}。语言标准只是规定它是前者而不是后者(或前者应该是首选);方括号可以规定相同的优先权。事实上,如果我没有弄错,那么实际上不会破坏任何现有代码 - 因为现有代码不会优先使用二进制文件foo(operator,(a,b)
  • 示例二进制文件operator[]只是一个示例,而不是我想要实现的内容。

0 个答案:

没有答案