相关疑难解决方法(0)

使用braced-init列表调用显式构造函数:是否含糊不清?

考虑以下:

struct A {
    A(int, int) { }
};

struct B {
    B(A ) { }                   // (1)
    explicit B(int, int ) { }   // (2)
};

int main() {
    B paren({1, 2});   // (3)
    B brace{1, 2};     // (4)
}
Run Code Online (Sandbox Code Playgroud)

建设brace(4)清楚明确地调用(2).在铛,施工paren(3)明确要求(1),其中作为GCC 5.2,它失败编译:

main.cpp: In function 'int main()':
main.cpp:11:19: error: call of overloaded 'B(<brace-enclosed initializer list>)' is ambiguous
     B paren({1, 2});
                   ^
main.cpp:6:5: note: candidate: B::B(A)
     B(A ) …
Run Code Online (Sandbox Code Playgroud)

c++ gcc language-lawyer c++11

21
推荐指数
1
解决办法
906
查看次数

调用重载<brace-enclosed初始化列表>是不明确的,如何处理?

我真的不明白这一点,我认为编译器首先执行大括号中的内容然后将结果赋予最合适的函数.这看起来它给函数一个初始化列表来处理它...

#include <string>
#include <vector>
using namespace std;

void func(vector<string> v) { }

void func(vector<wstring> v) { }

int main() {
  func({"apple", "banana"});
}
Run Code Online (Sandbox Code Playgroud)

错误:

<stdin>: In function 'int main()':
<stdin>:11:27: error: call of overloaded 'func(<brace-enclosed initializer list>)' is ambiguous
<stdin>:11:27: note: candidates are:
<stdin>:6:6: note: void func(std::vector<std::basic_string<char> >)
<stdin>:8:6: note: void func(std::vector<std::basic_string<wchar_t> >)
Run Code Online (Sandbox Code Playgroud)

为什么不func(vector<string> v)调用我的超载,我可以这样做吗?

c++ initializer-list ambiguous c++11

19
推荐指数
1
解决办法
4209
查看次数

标签 统计

c++ ×2

c++11 ×2

ambiguous ×1

gcc ×1

initializer-list ×1

language-lawyer ×1