【问题标题】:Default argument for abbreviated function template缩写函数模板的默认参数
【发布时间】:2021-08-19 23:19:28
【问题描述】:

我注意到我似乎不能像我期望的那样使用默认参数作为缩写函数模板。

#include <iostream>

auto f(const auto x = 0) {
    return x + sizeof(x);
}

int main() { 
    std::cout << f() << std::endl; // << broken
    std::cout << f(0) << std::endl;
    std::cout << f(short(8470)) << std::endl;
}

这是什么原因?

我的猜测是模板机制从不查看默认参数,所以我们遇到这种荒谬的情况,我可以定义一个模板函数,看起来就像它默认为 T=int(其中隐藏了 T模板类型),但是如果不手动指定类型似乎无法调用它:(f&lt;int&gt;())。

这主要是语言琐事,我不认为这是一个真正的问题,但函数模板没有 int 作为默认模板类型看起来确实很奇怪。

【问题讨论】:

  • @RemyLebeau 不错的发现,但我认为这是一个旧的 gcc 扩展......我相信普通 fns 的自动参数是 C++20
  • 它可能起源于 C++14 中的 gcc 扩展,但我认为该链接中的一些答案在 C++20 中的标准化风格下仍然适用于这种情况

标签: c++ templates c++20


【解决方案1】:

你对模板也有同样的问题:

template<class T>
auto f(const T x = 0) {
    return x + sizeof(x);
}

我的猜测是对auto参数所做的转换本质上就是上面的代码。

要使其正常工作,您必须指定默认模板类型 T:

template<class T = int>
auto f(const T x = 0) {
    return x + sizeof(x);
}

虽然缩写模板很有用,但当您需要更多控制时,您必须使用模板。例如,如果您的函数具有多个必须是相同类型的参数,也会出现这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2016-05-23
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多