模板参数推导在 C++14 上失败

Zos*_*oso 3 c++ templates

我试图编译这段代码,但它在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)

for*_*818 9

类模板参数推导 ( 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)

  • 请注意,这与 c++17 语义略有不同。该类不会隐式接受左值,而这个会。 (2认同)