【发布时间】:2016-04-13 10:03:43
【问题描述】:
这是简化的代码:
#include <vector>
class VInitList
{
public:
explicit VInitList(std::vector<int> v){}
};
int main()
{
VInitList vil({{}});
}
并用 g++ 5.2.1 编译得到这个错误:
error: call of overloaded ‘VInitList(<brace-enclosed initializer list>)’ is ambiguous
VInitList vil({{}});
^
main.cpp:6:5: note: candidate: VInitList::VInitList(std::vector<int>)
VInitList(std::vector<int> v){}
^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(const VInitList&)
class VInitList
^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(VInitList&&)
当我看到编译器错误时,我发现我写错了{{}}(是的,不要对我卑鄙),但我仍然无法理解错误。恕我直言,编译器必须摆脱额外的 {} 或返回语法错误。
然后我尝试编译这个:
std::vector<int> v = {{{}}};
按预期工作。
【问题讨论】:
-
我只浏览了您的示例,但您在编译的代码 sn-p 上多了一对括号,也许这就是原因?
-
它不能在 g++ 5.2.1 中编译,但在 Clang 3.7.0 中可以编译
-
有趣的问题。在您的场景中,单个
{}似乎在这两种情况下都足够了。包含的类型是int,为什么要复杂化? :-)
标签: c++ c++11 vector g++ initializer-list