gpt4 book ai didi

c++ - 为什么自动返回类型推导适用于未完全定义的类型?

转载 作者:IT老高 更新时间:2023-10-28 12:31:21 28 4
gpt4 key购买 nike

考虑以下几点:

template<typename Der>
struct Base {
// NOTE: if I replace the decltype(...) below with auto, code compiles
decltype(&Der::operator()) getCallOperator() const {
return &Der::operator();
}
};

struct Foo : Base<Foo> {
double operator()(int, int) const {
return 0.0;
}
};

int main() {
Foo f;
auto callOp = f.getCallOperator();
}

我想在 CRTP 基类中创建一个成员函数,其返回类型取决于派生类中 operator() 的签名。但是 decltype(&Der::operator()) 编译失败; Foo 中的 operator() 成员函数不可见。我假设这是因为在 Foo 完全定义之前实例化了基类模板。

令人惊讶的是,如果我将 auto 放置为它编译的返回类型。我假设 auto 会使编译器从函数体中推断出返回类型并失败——因为函数体使用了未完全定义的 Foo 类型。

MSVC 2015.3 和 Clang 3.8 的此行为相同

为什么代码开始使用 autoauto 类型推断是否以某种方式“延迟”实例化?或者使用与手写返回类型表达式不同的上下文?

最佳答案

你的猜测是正确的。在需要函数签名之前,实际上不会推导出推导的返回类型。这意味着它将在调用 getCallOperator 的上下文中推断出来,此时 Foo 已完全定义。

这是在 7.1.6.4p12 中指定的:

Return type deduction for a function template with a placeholder in its declared type occurs when the definition is instantiated even if the function body contains a return statement with a non-type-dependent operand.

关于c++ - 为什么自动返回类型推导适用于未完全定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38325730/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com