【发布时间】:2021-12-24 18:03:15
【问题描述】:
我正在阅读 Josh Lospinoso 的《C++ Crash Course》一书,并且一直在编译课程中的代码。我在使用以下代码时遇到了问题(这是本书中一个示例的简化版本)。
struct SmallStruct {};
template <typename T>
struct BigStruct {
BigStruct(const T& arg) : arg{arg} {};
private:
const T& arg;
};
int main() {
BigStruct main_struct{[](const SmallStruct&) {}};
}
这段代码我看不懂的主要部分是main()中的语句,专门用lambda函数构造的。我知道代码无法编译,因为在 main() 中实例化 BigStruct 对象时,它缺少模板参数。我试过<SmallStruct>、<SmallStruct&> 作为参数,但都没有编译。如果有人能解释发生了什么,那将对我的学习非常有益。
【问题讨论】:
-
欢迎来到 StackOverflow。如果这不能为您编译,则您的编译器可能设置为语言标准的太旧版本。用
g++ -std=c++17编译对我来说很好。模板参数是构造函数参数的类型。 -
你需要CTAD 来编译。它是在 c++17 中引入的。
-
感谢工作。那么为什么我们在实例化 BigStruct 对象时不需要提供模板参数呢?是自动推导出来的吗?
-
谢谢@super 刚刚看到你的链接。很有帮助
-
@Lachlan 构造函数参数需要允许从中推断模板类型,您的示例就是这种情况。例如,默认构造函数不允许这样做,在这种情况下,您仍然必须指定模板参数...
标签: c++ templates lambda constructor