我有以下代码:
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上的花括号可以避免错误。尽管如此,我想知道编译器为什么表现不同。
答案 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>