以下代码片段:
#include <functional>
struct X {
X(std::function<double(double)> fn); // (1)
X(double, double); // (2)
template <class T>
auto operator()(T const& t) const { // (3)
return t.foo();
}
};
int main() {
double a, b;
auto x = X(a, b);
return 0;
}
在使用 -std=c++14
编译时,无论是在 OSX 还是在 godbolt.org 上测试,在 clang
(4.0.1) 和 g++
(6.3, 7.2) 上都会编译失败。
但如果:
- 我删除构造函数
(1)
; - 或者在
(3)
中将返回类型设置为具体类型(例如double
); - 或者在
(3)
中使用后置返回类型 (-> decltype(t.foo())
) ; - 使用
-std=c++1z
编译(感谢 @bolov)。
也许我忽略了一些明显的问题...这段代码有什么问题吗?这是个bug吗?
C++1z
标志的错误:https://godbolt.org/g/izbzye 但是,说真的,用C++14
想干什么? - bolovauto x = X{a, b};
是另一种可以成功编译的语句变体? - Toby SpeightX x(a, b);
;在C++11中,推断的auto
作为返回类型还没有得到支持。 - Jarod42auto y = x
,则会发生相同的情况。 - Oliv