初始化列表作为运算符[]的参数

问题描述 投票:0回答:2

这个问题与这里讨论的问题相关。

我尝试使用初始化列表来创建要传递给

operator[]
的参数。

#include <string>
#include <vector>

struct A {

std::string& operator[](std::vector<std::string> vec)
{
  return vec.front();
}

};

int main()
{
    // ok
    std::vector<std::string> vec {"hello", "world", "test"};

    A a;
    // error: could not convert '{"hello", "world", "test"}' to 'std::vector...'
    a[ {"hello", "world", "test"} ];
}

我的编译器(GCC 4.6.1)抱怨:

g++ -std=c++0x test.cpp
test.cpp: In function ‘int main()’:
test.cpp:20:8: error: expected primary-expression before ‘{’ token
test.cpp:20:8: error: expected ‘]’ before ‘{’ token
test.cpp:20:8: error: expected ‘;’ before ‘{’ token
test.cpp:20:35: error: expected primary-expression before ‘]’ token
test.cpp:20:35: error: expected ‘;’ before ‘]’ token

这应该是有效的 C++11 吗?

有趣的是,当使用

operator()
而不是
operator[]
时,它可以工作。

c++ c++11 curly-braces initializer-list
2个回答
4
投票

是的,它是有效的 C++11,并且应该在任何兼容的编译器中工作。

请注意,gcc 中的 C++11 支持相当不成熟,此代码示例无法在任何 4.6 版本中编译,而只能在 4.7 svn snapshot 版本中编译。


0
投票

是的,它是有效的。您使用的 GCC 版本尚未完全支持 C++11,因此即使符合标准,也无法编译。

更新版本的 GCC 可以编译您的代码。 请参阅编译器资源管理器中的实时示例

© www.soinside.com 2019 - 2024. All rights reserved.