c++ - 缩写函数模板的默认参数

标签 c++ templates c++20

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

#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<int>() )。

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

最佳答案

你和模板有同样的问题:

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);
}

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

关于c++ - 缩写函数模板的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68855406/

相关文章:

c++17 polyfills 和 boost

c++ - 所有类型的 std::vector 的部分特化

c++ - 传递模板参数时 MSVC++ 编译器错误 C2923

c++ - Apple clang 和 C++20 运算符歧义与继承的比较运算符

C++ 在 Vector 中查找对象成员值

c++ - boost::asio::io_service 优先级如何工作?

c++ - 在 Visual Studio 2012 Express 中设置 C++ 调试环境

css - 如何在 Angular 5 元素中为管理员和用户使用单独的模板?

ubuntu - GCC/G++ 使用特定版本的 libc++

c++ - 在 C++14、C++17、C++20 和不同的编译器中, float 和整数之间的按位转换是否有处理未定义行为的最佳方法?