c++std库实现者在为remove_cvref模板添加特化时警告未定义行为的关注点是什么?
在此链接中,https://en.cppreference.com/w/cpp/types/remove_cvref,它指出
template< class T >
struct remove_cvref;
如果类型 T 是引用类型,则提供成员 typedef type,它是 T 引用的类型,并删除了其最顶层的 cv 限定符。否则,类型是 T 并删除其最顶层的 cv 限定符。
添加专业化的程序的行为
remove_cvref是未定义的。
在这种情况下,c++ std 库实现者关心的是什么?
回答
C++ 标准禁止对几乎所有 C++ 类型特征模板进行特化。这样做的原因是因为类型特征应该是低级的、基本的构造,它们完全并且只做它们所说的。这意味着不应允许用户通过用他们想要的任何东西替换他们的功能来与他们一起拉扯通常的恶作剧。
假设您在某个模板参数类型上的模板函数中T。如果T碰巧是int. 但是,如果T是 anint&或 aconst int或其他什么,这段代码就可以正常工作。您只想查看用户是否提供int了类型。
你使用remove_cvref_tgetint作为一种类型,然后is_same_v它针对int. 这只有remove_cvref在完全正确且仅按照它所说的进行时才能起作用。如果用户可以专门化它,那么他们就可以对您撒谎,使他们的用户定义类型看起来像 an int,从而破坏您的代码。
将 C++ 中的类型特征视为在头文件中定义而不是始终存在的语言类型操作。按理说,C++ 应该有一个运算符将类型转换为它自己的删除 cvref 版本。我们有类型特征元函数,而不是专用运算符。但不管它是如何定义的,它仍然是一个基本的操作,你不应该改变它的含义。
THE END
二维码