出于好奇,我查看了如何std::is_pointer实现并看到了这样的东西(多个重载之一):
template <class _Ty>
_INLINE_VAR constexpr bool is_pointer_v<_Ty*> = true;
Run Code Online (Sandbox Code Playgroud)
如果我复制并粘贴到我的代码中并编译,则表示 constexpr 在这里无效。怎么了?
是否可以像我们一样std::is_pointer实现结构体?std::is_reference(不是我愿意,只是好奇所以请不要来找我)
MRE 与 msvc 2019:
template <class _Ty>
inline constexpr bool is_pointer_v<_Ty*> = true;
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
--
Error: error C7568: argument list missing
after assumed function template 'is_pointer_v'
Run Code Online (Sandbox Code Playgroud)
回答标题中的问题:
不,标准库代码不需要遵守用户代码的语言规则。从技术上讲,它甚至不需要用 C++ 实现,但可以直接集成到编译器中。
然而,实际上标准库代码总是像用户代码一样由编译器编译,因此它不会使用编译器会拒绝用户代码的任何语法结构。然而,它将使用特定于编译器的扩展,并保证用户代码通常不应该依赖。标准中还专门针对标准库的实现做了一些保留。
例如,您从标准库实现中显示的代码片段不是有效的用户代码,因为它_Ty是用户代码可能无法使用的保留标识符,因为它以下划线开头,后跟大写字母。此类标识符专门保留给标准库实现。仅出于这个原因,大多数标准库代码将不是有效的用户代码。
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |