具有未定义的成员函数返回类型的模板实例化

特伦
struct Value {
    using a_type = int;
    a_type f() { return 1; }
};

template<typename T>
struct Wrapper {
    T t;
    auto call_f() { return t.f(); }
};

int main() {
    Wrapper<Value> w;
    Wrapper<int> w2;
    w.call_f();
}

这在Clang和GCC上编译良好。Wrapper<int>即使Wrapper<int>::call_f()无法推断出的返回类型(没有int::f()被实例化它只有在w2.call_f()被调用才会失败

这是C ++标准的一部分,可以预期在所有编译器上都可以使用吗?

格子呢骆驼

是的,这是C ++标准的一部分。

模板实例化的规则很长很复杂,但是简短的版本是模板类的成员函数仅在需要时才实例化。如果没有任何东西调用它,或者试图获取指向它的指针,或者显式实例化它(可能还有其他一些我忘记的情况),那么它将不会被实例化并且您的代码格式正确。

正如@dyp所指出的,只有在实例化类定义(时实例化成员函数声明[temp.inst]/1,而返回类型推论仅在实例化函数定义[dcl.spec.auto]/12)时进行。

这对于最小化模板的开销以及允许类型要求都是非常有用的。通过此功能,您可以执行以下操作:

struct Foo {
    //no default constructor
    Foo(int);
};

std::vector<Foo> foos;

某些std::vector功能(resize例如)需要T默认可构造,但只要不调用这些功能,您仍可以使用的其他功能std::vector

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有布尔模板参数的成员函数的显式模板实例化

具有不同返回类型的模板实例

具有复杂类型的C ++模板实例化

使用模板化返回类型实例化虚拟成员函数

跨DLL的C ++成员函数显式模板实例化

具有非类型参数包的模糊类模板实例化

在C ++中的模板实例化中将带有构造函数的类用作类型参数

具有if语句的C ++模板实例化

为什么C ++函数模板实例化的返回类型包含在错误的函数名称中?

为什么在使用带有 decltype 的尾随返回类型调用同名函数时,模板实例化中会发生无限递归?

函数具有值但返回未定义

constexpr函数失败的模板实例化

C++ 模板实例化,错误:非类类型“int”的成员

为什么在函数体内定义的内置类型的未初始化对象具有未定义的值?

C++ 模板、类型名和运算符<<:错误:未定义函数模板“operator<<”的显式实例化

约束成员函数和显式模板实例化

模板实例化

为什么要使用继承和多态性而不是函数模板实例来调用具有相同签名的成员函数?

对模板基类的成员函数的未定义引用

无法使用 make_index_sequence 作为函数的默认参数(未定义模板的实例化)

本征自然对数函数的问题:“未定义模板的隐式实例化”

类中现有成员的模板实例化检查

可以实例化c ++类模板,但是具有相同模板参数的功能模板实例化失败

模板化函数参数的显式模板实例化

模板化类构造函数的模板实例化

具有不同定义的模板函数是否会导致未定义的行为?

typedef中的模板实例化是否具有有限的作用域?

未定义引用`operator <<(std :: ostream&,/ *具有非类型模板参数的类* /&)'

具有多种数据类型的c ++“未定义引用”模板类