gpt4 book ai didi

c++ - Gcc 失败并显示 "call of overload is ambignuous"而 clang 没有

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:00 24 4
gpt4 key购买 nike

我有以下代码:

#include <experimental/string_view>

struct b_symbol {
template <typename T>
explicit b_symbol(T&& symbol)
: symbol(std::forward<T>(symbol)) {
}

std::experimental::string_view symbol;
};

struct b_utf8 {
template <typename T>
explicit b_utf8(T&& value)
: value(std::forward<T>(value)) {
}

std::experimental::string_view value;

};

struct value {
explicit value(b_utf8) {}
explicit value(b_symbol) {}

};

int main() {
value v({b_utf8("test")});
}

您可以在 godbolt 上试用.

如果我用 clang (3.8.0) 编译它:
clang++ oload.cpp -std=c++1y
一切正常。

如果我用 gcc (6.1.1 20160602) 编译它
g++ oload.cpp -std=c++1y
我得到:

oload.cpp: In function ‘int main()’:
oload.cpp:30:29: error: call of overloaded ‘value(<brace-enclosed initializer list>)’ is ambiguous
value v({b_utf8("test")});
^
oload.cpp:25:14: note: candidate: value::value(b_symbol)
explicit value(b_symbol) {}
^~~~~
oload.cpp:24:14: note: candidate: value::value(b_utf8)
explicit value(b_utf8) {}
^~~~~
oload.cpp:23:8: note: candidate: constexpr value::value(const value&)
struct value {
^~~~~
oload.cpp:23:8: note: candidate: constexpr value::value(value&&)

为什么会有这种差异?
gcc 的行为是否正确?

编辑:正如 slavanap 在他的回答中指出的那样,可以通过删除调用站点上的大括号来避免错误。尽管如此,我还是想知道为什么编译器的行为不同。

最佳答案

您正在将初始化列表传递给显式采用 b_utf8 或 b_symbol 的构造函数,两者都不正确。

如果您不想使用隐式转换,则必须定义一个采用初始化列表的构造函数。

我认为这正在针对 C++17 进行更改,届时您将被允许以 clang 方式进行更改。

编辑:有趣的是

struct  b_utf8 {

b_utf8() = default;
//b_utf8(){}
};

struct value {
explicit value(b_utf8) {}
};

int main() {
value v({b_utf8()});
}

编译但是

struct  b_utf8 {

//b_utf8() = default;
b_utf8(){}
};

struct value {
explicit value(b_utf8) {}
};

int main() {
value v({b_utf8()});
}

重载解析失败。我不确定为什么,据我所知,重载解析应该在这两种情况下表现相同。

关于c++ - Gcc 失败并显示 "call of overload is ambignuous"而 clang 没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38830427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com