Mq-b/Modern-Cpp-templates-tutorial

`04模板全特化` 中“细节”代码注释描述错误

Closed this issue · 6 comments

https://github.com/Mq-b/Modern-Cpp-templates-tutorial/blob/main/md/%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/04%E6%A8%A1%E6%9D%BF%E5%85%A8%E7%89%B9%E5%8C%96.md

见细节部分的第三个代码块

//constexpr auto n3 = g<int>(0); // Error! 函数模板 f 所实例化的所有函数都不可编译期求值,它们都不以 constexpr 修饰

注释中的f应该为g

非常抱歉,由于我的疏忽留下了错误的链接地址,现已修正到正确的地址

Mq-b commented

首先很感谢您的提醒,这的确需要修改,写的时候没注意。
其次,您的链接是错误的,无法打开。

首先很感谢您的提醒,这的确需要修改,写的时候没注意。 其次,您的链接是错误的,无法打开。

我还是喜欢“你链接错了,无法访问”

首先很感谢您的提醒,这的确需要修改,写的时候没注意。 其次,您的链接是错误的,无法打开。

constexpr修饰在模板,特化的没有constexpr,所以没特化的能constexpr,特化的不能constexpr

Mq-b commented

另外,其实注释的错误不单单是一个 f 的问题。

Error! 函数模板 f 所实例化的所有函数都不可编译期求值,它们都不以 constexpr 修饰

这段注释本身不对,如果函数模板 g 我们没有使用 g<int>,自然可以编译期求值:https://godbolt.org/z/1Prqr8Woj

template<class T>
constexpr T g(T) { return 6; }            // 这里声明的 constexpr 修饰函数模板是无效的
template<>
int g<int>(int) { return 6; }             // OK,g<int> 不是以 constexpr 修饰的

int main(){
    //constexpr auto n3 = g<int>(0);      // Error! 函数模板 g<int> 不是以 constexpr 修饰的
    constexpr auto n3 = g<double>(0);     // OK 函数模板 g<double> 自然没问题
}
Mq-b commented

首先很感谢您的提醒,这的确需要修改,写的时候没注意。 其次,您的链接是错误的,无法打开。

constexpr修饰在模板,特化的没有constexpr,所以没特化的能constexpr,特化的不能constexpr

我已经注意到,并且我重新观看了一下视频,似乎在我录制视频的时候我根本没看教案,是自己写的,倒是没说出什么问题。

Mq-b commented

视频中我提到了一句话:

以我们特化为准

倒也没问题。