【发布时间】:2021-01-27 21:39:37
【问题描述】:
对于具有许多大型和复杂模板实例化的库,在我看来,决定是否使用概念的主要考虑因素之一是构建输出的大小是否更小。
对于 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++ templates c++20 c++-concepts