相关疑难解决方法(0)

模板编译

我有可能是一个愚蠢的问题,但我只是不理解我的书对它的解释.

它说"当编译器看到模板的定义时,它不会生成代码.它只在我们实例化模板的特定实例时生成代码.事实上代码只在我们使用模板时生成(而不是在我们使用模板时生成定义它)影响我们组织源代码的方式以及何时检测到错误...要生成实例化,编译器需要具有定义函数模板或类模板成员函数的代码.因此,与非模板代码不同,模板的标题通常包括定义和声明."

"生成代码"究竟是什么意思?我想我从来没有真正考虑过编译器发生了什么,并且对它没有太多了解,所以当你编译模板函数或类与非模板函数或类相比时,我不理解它们有什么不同

c++

22
推荐指数
3
解决办法
2万
查看次数

C++ 中仅返回类型不同的重载函数模板

众所周知,仅返回类型不同的普通函数不能在 C++ 中重载。

但这个限制不适用于重载的函数模板,例如:

int f(auto) { return 1; }
auto f(auto) { return 2; }
Run Code Online (Sandbox Code Playgroud)

所有编译器都接受它,演示: https: //gcc.godbolt.org/z/qj73Mzehd

为什么该语言对模板做出这样的例外?

如果重载函数的返回类型不同,则可以使用强制转换为预期函数类型来选择其中一个函数。令人惊讶的是,即使返回类型实际上相同,Clang 也允许解决歧义,例如:

((int(*)(int))f)(3);
Run Code Online (Sandbox Code Playgroud)

选择

int f(auto) { return 1; }
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/snfvbq1ME

Clang这里错了吗?

c++ templates language-lawyer overload-resolution c++20

16
推荐指数
1
解决办法
1209
查看次数