基本字符串是否有任何用途<;T>;其中T不是字符类型? C++字符串的声明:

基本字符串是否有任何用途<;T>;其中T不是字符类型? C++字符串的声明:,c++,string,C++,String,使用一个整数字符串,我们不能将其初始化为字符串(显然)或u32字符串(至少对我来说不是那么明显);但只要列表的包含类型可转换为int,我们就可以使用initializer\u list对其进行初始化: string err1("test"); // Error! string err2(U"test"); // Error! string err3{"test"}; // Error! string err4{U"test"}; // Error! string err5 = "te

使用一个整数字符串,我们不能将其初始化为字符串(显然)或u32字符串(至少对我来说不是那么明显);但只要列表的包含类型可转换为
int
,我们就可以使用
initializer\u list
对其进行初始化:

string err1("test");   // Error!
string err2(U"test");  // Error!
string err3{"test"};   // Error!
string err4{U"test"};  // Error!
string err5 = "test";  // Error!
string err6 = U"test"; // Error!

string success1({U't', U'e', U's', U't'});
string success2 = {U't', U'e', U's', U't'};
string success3({'t', 'e', 's', 't'});
string success4 = {'t', 'e', 's', 't'};
但是,即使我们设法初始化整数字符串,我们也无法以正常方式使用它:

std::cout << success1; // Error! expected 116101115116

std::cout在构建标记器时,会想到char[n]或enum。请注意,令牌的构造函数不是由基本字符串运行的

#include <iostream>
#include <string>
#include <string.h>

static const int max_token_length = 10;

struct Token
{
    char str[max_token_length];
};

// define std::char_traits<Token> if your implementation defaults are not fine for you (or don't exist as it's not required)

int main() {
    Token t;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s1( 1, t );

    Token u;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s2( 1, u );

    std::basic_string<Token> s = s1 + s2;

    return 0;
}
#包括
#包括
#包括
静态常量int max_token_length=10;
结构令牌
{
char str[最大标记长度];
};
//如果您的实现默认值不适合您(或者不存在,因为它不是必需的),请定义std::char\u traits
int main(){
令牌t;
strncpy(t.str,“for”,最大长度);
std::基本_字符串s1(1,t);
令牌u;
strncpy(t.str,“for”,最大长度);
std::基本_字符串s2(1,u);
标准::基本字符串s=s1+s2;
返回0;
}

如果您使用的系统处理多个文本编码(例如ASCII和EBCDIC),您可能需要为每个编码使用单独的字符类型和字符串类型。它们都应被视为字符串,但类型明显不同。

字符串只是一个专门用于人类可读文本的向量,带有重载,例如operator@BoBTFish添加一个输出操作符不是很容易解决吗?OP所要求的东西只能用T字符串实现,而不能用T向量实现(或者这将很难实现)@tobi303我认为你是对的,但以相反的方式:“你能用
std::basic_字符串做什么,而你不能用
std::vector
?”.在C++11之前,我们使用
std::basic_string
(带有
std::char_traits
专用)来保存UTF32字符串。在某些地方,我们使用其他字符特性来实现不区分大小写的比较或通配符搜索。C++98中的FWIW
basic_string
保证是连续的,而
vector
不是。你说的“构造函数未运行”是什么意思?当然是!在这一行的右边:
std::basic_字符串s,默认构造函数。顺便说一下,基本字符串默认构造函数将其初始化为空实例(零长度字符串,未指定容量)。这意味着s[0]可能还不存在,除非您正确设置它。@quetzalcatl:Token的构造函数没有运行(只执行赋值),基本字符串的构造函数当然会执行。编辑以澄清这一点。您可以验证这一点:如果在构造函数之前添加一个赋值无效的类型,它通常会失败。这就是为什么我们不能使用std::basic_字符串的原因之一。关于整个答案,您不也必须定义
std::char_traits
的专门化吗?有一个
eof
值和所有东西。让我们忽略一个事实,
strcpy
是非常危险的,永远不应该被使用(我们有
strncpy
,它仍然危险,但不那么危险)。让我们忽略一个事实,即您没有为您的类型专门化
char\u traits
s[0]
必须存在,但它表示初始化的值
charT
value(常规字符串的空终止符)。不允许写入终止符值。因此,这是代码错误的另一种方式。s[0]始终存在。From:'(1)空字符串构造函数(默认构造函数)构造一个长度为零个字符的空字符串。'请注意,容量不一定等于长度;两个都是尺码。运算符[]()定义,对于大小,它将ref返回到“\0”;在C++11中,这正好在最后一个字符之后。
std::cout << success1; // Error! expected 116101115116
#include <iostream>
#include <string>
#include <string.h>

static const int max_token_length = 10;

struct Token
{
    char str[max_token_length];
};

// define std::char_traits<Token> if your implementation defaults are not fine for you (or don't exist as it's not required)

int main() {
    Token t;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s1( 1, t );

    Token u;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s2( 1, u );

    std::basic_string<Token> s = s1 + s2;

    return 0;
}