c++ - c++ 概念是否会导致编写模板实例以构建输出?

标签 c++ templates c++20 c++-concepts

对于具有许多大型复杂模板实例的库,在我看来,决定是否使用概念的主要考虑因素之一是构建输出的大小是否更小。
使用SFINAE,我的理解是以下代码会导致模板实例化std::is_function<bar>std::enable_if<true, bool>包含在构建输出中,增加其大小(尽管在本示例中略有增加):

#include <type_traits>

template<typename F,
         typename = std::enable_if_t<
                    std::is_function<F>::value,
         bool> = true>
void foo(F& f)
{
    // do some stuff with f
}

void g();

int main()
{
    foo(g);
    return 0;
}
如果基于 std::is_function 的 C++20 概念改为使用,显然模板必须被实例化以检查它。但是那个实例化然后写入最终的构建输出吗?这是否因编译器实现而异?
#include <type_traits>

template<typename F>
concept Function = std::is_function<F>::value;

template<Function F>
void foo(F& f)
{
    // do some stuff with f
}
//...

最佳答案

您似乎担心代码大小。
类,在这里我包括类模板的实例化,只是编译器知道的抽象信息。它们不会影响代码大小。
只有函数,包括成员函数,才会影响代码大小。类模板的成员函数仅在实例化时才会影响代码大小,因为它们的使用方式需要它(C++ 标准将其称为“ODR-used”)。
在您的示例中,没有 std::is_function 的成员函数和 std::enable_if是 ODR 使用的,因此它们不会被实例化,并且它们不会影响代码大小。

But is that instantiation then written to the final build output?


没有生成代码。但通常编译器会将调试信息写入输出。从这个意义上说,有些东西被写入输出。

And does this differ depending on compiler implementation?


就调试信息而言:是的。但是实例化是否发生是由语言规则决定的,编译器之间应该没有区别。

关于c++ - c++ 概念是否会导致编写模板实例以构建输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65927798/

相关文章:

c++ - C++ 中的模板化映射/多映射函数

c++ - 如果模板类型是可实例化的,则执行某些操作

c++ - 为什么 C++20 概念与 "const auto&"不兼容?

c++ - 规范化约束时,需要表达式是原子吗?

c++ - 复制初始化和直接初始化有区别吗?

c++ - boost program_options 自定义验证

c++ - 在 C++ 中调用作为参数传递的同一模板函数的两个版本

c++ - 函数输入参数的 auto 是否可以替代函数模板?

c++ - 在c/c++中是否有相当于python的urllib?

c++ - 进程返回 255 <0xFF>,c++,程序停止工作