不允许在C++中使用多参数运算符 [] 的根本原因
Fundamental reasons for not allowing multi-arguments operator[] in C++
目前,我们只能用一个参数重载operator[]
。
我想知道标准不允许为多个参数重载operator[]
是否有根本原因?
C++17 有这种方式的 propoposal 吗?
这可能可以添加,但不应该添加,因为它会破坏现有代码。
基本上,operator[]
多个参数意味着以下内容将编译:
struct Foo
{
int operator[](int a, int b, int c)
{
return 0;
}
}
int main()
{
Foo foo;
auto n = foo[1, 2, 3]; // list of parameters
}
但是,请考虑以下情况:
int main()
{
Foo foo;
std::vector<int> bar(4, 0);
auto n = foo[1, 2, 3]; // list of parameters
auto x = bar[1, 2, 3]; // comma operator! returning the 3rd element of bar. valid syntax
}
这意味着,在方括号内使用逗号的表达式中,可以是参数列表或使用逗号运算符。因此,运算符 [] 的参数只能只有一个有效数字,这意味着无法解决此问题:
struct Foo
{
int operator[](int a, int b, int c)
{
return 0;
}
int operator[](int a)
{
return 1;
}
}
这里没有办法消除1, 2, 3
的歧义。这意味着:如果标准更改为允许这样做,则在调用operator[]
时使用逗号运算符的任何代码都将成为编译错误。标准委员会努力不破坏现有代码(这是一件好事!)引入新功能。在我看来,这将是一个相当激进的变化,因此不太可能完成。
如果你想要多个参数,要么使用不同的运算符(正如 Mike 建议的那样,operator()
会起作用)或传递一个std::tuple
或等效项。
我想知道标准不允许为几个参数重载
operator[]
是否有根本原因?
没有根本原因;只是重载运算符与它们重载的内置运算符具有相同语法的一般原则。
C++17 有这种方式的 propoposal 吗?
不。一种常见的替代方案是过载operator()
;这可以接受任意数量的参数。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 运算符重载:"operator+"必须采用零个或一个参数
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 参数相关查找和流运算符重载
- C++:使用运算符 = 调用多参数构造函数
- 了解布尔运算符==(参数 1,参数 2)
- 我能否根据其运算符()的签名专门化可变参数模板参数
- SFINAE 检查模板参数运算符
- 不允许运算符 const 参数调用 const 成员函数
- 为私有结构定义双参数运算符重载
- C++ 通过自定义赋值运算符隐式转换函数参数
- 函数参数变量总是需要 & 或 * 运算符吗?
- 算术运算符参数类型
- 隐式转换以匹配运算符参数
- 对重载运算符参数执行隐式转换时出现编译器错误
- 避免在C++中强制转换运算符参数
- 如果给定模板不是运算符参数类型的专用模板,则禁用运算符重载
- 以及C++中的运算符参数求值
- 这个函数的运算符参数太多