我目前正在考虑如何最佳约束模板的通用类型到std::sting
以及字符串文字。因此,我使用std::is_same
将推导出的类型与期望的类型进行比较。在std::string
的情况下,这个工作马上。对于一个字符串字面值,意思是一个字符常量数组,它只在我使用该类型的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
返回在第一种情况下假,即使类型似乎是相同的。
我可以想出的唯一可能的解释是,在功能std::is_same
中,类似于std::decay
的转换被应用于类型(例如函数调用)。但是,这种转变也会发生在另一种类型上,产生相同的结果,从而导致平等。
等到C++ 17,然后编写模板以使用'std :: string_view'。 –
尝试从'TYPE'中移除参考。字符串文字是左值。 –
谢谢你,你是对的。我不知道。将行更改为'std :: is_same> :: value'会导致相等。为什么字符串文字被认为是左值?如果它是一个整型文字,而不是它将被视为一个右值,不是吗?我们可以让这个被接受的答案吗? –
user1488118