我目前正在考虑如何最好地约束模板的通用类型为std::string
以及字符串字面值。因此,我使用std::is_same
将推导出的类型与所需类型进行比较。对于std::string
,这种方法立即奏效。对于字符串字面值,即char const数组,只有当我在类型上使用std::decay
,然后将结果与类型char const *
进行比较时,才能正常工作。如果我直接将推导出的类型与我认为的类型进行比较,is_same
返回false,如下面的示例代码所示。
template <class TYPE>
void function(TYPE&& parameter)
{
//this doesn't work as expected
std::cout << typeid(TYPE).name() << " : " << typeid(char const [5]).name() << std::endl;
std::cout << std::is_same<char const [5], TYPE>::value << std::endl;
//this works as expected
std::cout << typeid(std::decay_t<TYPE>).name() << " : " << typeid(char const *).name() << std::endl;
std::cout << std::is_same<char const *, std::decay_t<TYPE>>::value << std::endl;
}
int main(int argc, char** argv)
{
function("name");
return 0;
}
生成的输出如下:
char const [5] : char const [5]
0
char const * __ptr64 : char const * __ptr64
1
现在我想知道的是,为什么即使类型看起来完全相同,在第一个情况下is_same
返回false。
我能想到的唯一可能的解释是,在函数std::is_same
内部应用了类似于std::decay
的转换到类型上(例如函数调用)。但是再一次地,这种转换也会发生在另一个类型上,得出相同的结果,从而导致相等。
std::string_view
。 - Sam VarshavchikTYPE
中删除引用。字符串文字是 lvalue。 - Kerrek SBstd::is_same<char const [5], std::remove_reference_t<TYPE>>::value
会导致相等。为什么字符串字面值被认为是左值?如果它是一个int字面值,它会被认为是右值,不是吗?我们可以把这个作为接受的答案吗? - bweber