【发布时间】:2014-01-01 14:05:38
【问题描述】:
我制作了一个模板,它添加了给定的数据。如果我这样使用,编译器会将 in_1 和 in_2 声明为 const char *,代码无法编译。
#include <iostream>
using namespace std;
template <class T>
T addstuff(T part_1, T part_2){
return(part_1+part_2);
}
int main(int argc, char const *argv[])
{
auto in_1="Shut ";
auto in_2="up.";
cout<<addstuff(in_1, in_2)<<endl;
return 0;
}
如果我声明 in_1 和 in_2 std::string,它就像一个魅力。
为什么编译器不能(或不)自动声明这些字符串 std::string?
【问题讨论】:
-
为什么会这样?它们的类型不是
std::string而是const char (&)[N + 1](N 是字符串的长度)。 -
这就是我们需要字符串文字 (en.cppreference.com/w/cpp/string/basic_string/operator%22%22s) 的原因。一个令人困惑的问题,但它显示了人们对 C++ 的期望有多远(以及它对初学者的友好程度)。
-
为了它的价值:您可以在 C++11 中将字符串文字后缀自己实现为 _s;无需等待。
std::string operator"" _s(const char * str, size_t len) { return std::string{str, len}; }