【发布时间】:2016-08-08 13:24:32
【问题描述】:
我有以下代码:
#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 在他的回答中指出的那样,可以通过删除呼叫站点上的花括号来规避该错误。尽管如此,我还是想知道为什么编译器的行为不同。
【问题讨论】:
-
好吧...“std::experimental”