Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;_C++_C++11_Multidimensional Array_Standards_Subscript - Fatal编程技术网

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;
    }
}