我试图编译这段代码,但它在C++14运行时失败C++17
#include <cstdio>
#include <utility>
template <typename F>
struct S {
explicit S(F&& fn): fn(std::move(fn)) {}
F fn;
~S() { fn(); }
};
int main(){
S obj([]() noexcept {
std::printf("Foo\n");
});
}
Run Code Online (Sandbox Code Playgroud)
我看到在 的C++17构造函数中S已被调用为
call S<main::{lambda()#1}>::S(main::{lambda()#1}&&)
Run Code Online (Sandbox Code Playgroud)
这表明编译器推导了模板参数。C++14除了执行以下操作之外,还有其他方法可以编译此代码吗?
auto fn = []() noexcept {
std::printf("Foo\n");
};
S<decltype(fn)> obj(std::move(fn));
Run Code Online (Sandbox Code Playgroud)
类模板参数推导 ( CTAD ) 仅在 C++17 中引入。您可以使用函数推导出参数:
template <typename F>
S<F> make_S(F&& fn) { return S<F>{std::forward<F>(fn)}; }
int main(){
auto obj = make_S([]() noexcept {
std::printf("Foo\n");
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |