【发布时间】:2012-01-09 10:23:07
【问题描述】:
这个问题与here讨论的问题有关。
我尝试使用初始化列表来创建要传递给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[] 时,它可以工作。
【问题讨论】:
-
绝对是编译器错误,
a.f({"aa", ""bb"})和a[{"aa", ""bb"}]之间应该绝对没有区别。 -
传递一个临时显式编译,不过:
a[ std::vector<std::string>({"hello", "world", "test"}) ];
标签: c++ c++11 curly-braces initializer-list