【发布时间】:2022-01-06 08:14:01
【问题描述】:
我试图编译此代码,但它在 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");
});
}
我在C++17中的see thatS的构造函数被调用为
call S<main::{lambda()#1}>::S(main::{lambda()#1}&&)
这表明编译器推导出了模板参数。除了执行以下操作之外,还有其他方法可以在 C++14 中编译此代码吗?
auto fn = []() noexcept {
std::printf("Foo\n");
};
S<decltype(fn)> obj(std::move(fn));
【问题讨论】:
-
代码依赖于 C++17 特性。没有办法将其构建为未更改的 C++14。
-
@StoryTeller-UnslanderMonica 我明白了。您能否指出您所指的具体功能?
-
CTAD。从字面上看,您正在尝试做的事情。