Gcc失败了#34;过载的呼唤是暧昧的"虽然铿锵没有

时间:2016-08-08 13:24:32

标签: c++ gcc clang

我有以下代码:

 mAPI.gettheChannel().getAuthenticationStatus(Constants.HTTP.PARAMSAUTH)
                     // use the result from a previous call to perform another one
                     .flatMap(result -> mApi.gettheChannel().getAuthentificationChannel(result))
                     .subscribeOn(Schedulers.io()) // optional if you do not wish to override the default behavior
                     .observeOn(AndroidSchedulers.mainThread())
                     .subscribe();

您可以在godbolt上尝试。

如果我用clang(3.8.0)编译它:
#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")}); }
一切都很顺利。

如果我用gcc(6.1.1 20160602)编译它 clang++ oload.cpp -std=c++1y
我明白了:

g++ oload.cpp -std=c++1y

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

编辑: 正如slavanap在他的回答中指出的那样,通过删除call-site上的花括号可以避免错误。尽管如此,我想知道编译器为什么表现不同。

2 个答案:

答案 0 :(得分:1)

您正在将初始化列表传递给明确接受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()});
}

无法解决重载问题。我不知道为什么,据我所知,在这两种情况下, 的重载分辨率应该表现相同。

答案 1 :(得分:0)

错误中显示devtools::install_github("ropensci/plotly") library(plotly) p <- plot_ly() for(i in 1:5){ p <- add_trace(p, x = 1:10, y = rnorm(10), mode = "lines") } p

<brace-enclosed initializer list>