C++ C++;
目前,我们只能用一个参数重载C++ C++;,c++,c++11,multidimensional-array,standards,subscript,C++,C++11,Multidimensional Array,Standards,Subscript,目前,我们只能用一个参数重载运算符[] 我想知道,标准不允许为几个参数重载运算符[]是否有根本原因 对于C++17,是否有这样的专有技术 我想知道,标准不允许为几个参数重载运算符[]是否有根本原因 没有根本原因;只是重载运算符与它们重载的内置运算符具有相同语法的一般原则 对于C++17,是否有这样的专有技术 不可以。常见的替代方法是重载操作符();这可能可以添加,但不应该添加,因为它会破坏现有代码 基本上,运算符[]的多个参数意味着将编译以下内容: struct Foo { int op
运算符[]
我想知道,标准不允许为几个参数重载运算符[]
是否有根本原因
对于C++17,是否有这样的专有技术
我想知道,标准不允许为几个参数重载运算符[]
是否有根本原因
没有根本原因;只是重载运算符与它们重载的内置运算符具有相同语法的一般原则
对于C++17,是否有这样的专有技术
不可以。常见的替代方法是重载操作符();这可能可以添加,但不应该添加,因为它会破坏现有代码
基本上,运算符[]
的多个参数意味着将编译以下内容:
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
}
这里没有办法消除1,2,3
的歧义。这意味着:如果标准更改为允许此操作,则在调用运算符[]
时使用逗号运算符的任何代码都将成为编译错误。通过引入新特性,标准委员会努力不破坏现有代码(这是一件好事!)。在我看来,这将是一个相当彻底的改变,因此不太可能做到
如果需要多个参数,可以使用不同的运算符(正如Mike所建议的,operator()
可以工作),也可以传递一个std::tuple
或等效值 反问:有什么根本原因不能使用操作符()
?@PeterT:我在寻找多阵列讨论,以了解将来的提案,其中讨论了此限制的解决方法。因此,我想知道为什么有一个根本原因,为什么不能考虑多参数操作符[C]?对于C++的核心修改……“永不中断现有代码”有点太强了。“只有在有充分理由的情况下才破坏现有代码”。在每一次修订中都会有无数次破坏性的变化:在未来,几乎每一次对接口的修改都会在理论上破坏,因为如果某些表达式不编译,我们可以让代码有条件地运行。@yakafaik他们会尽最大努力避免破坏。当然,如果添加了新的关键字,这可能会破坏一些东西,但它们肯定不会对逗号运算符进行如此彻底的更改。我稍微改变了我的表述。
struct Foo
{
int operator[](int a, int b, int c)
{
return 0;
}
int operator[](int a)
{
return 1;
}
}