我有两个不同的样本:
std::string* to_return = new std::string("I love" + _name + " so much!");
和
std::string* to_return = new std::string("I love" + "Martin" + " so much!");
第一个示例说明了在尝试添加另一个名为" _name"的简单字符串对象时的初始化。 在secons示例中,我只连接三个不同的字符串...
尝试制作第二个样本时出现错误:
表达式必须具有整数或未整合的枚举类型
答案 0 :(得分:6)
"I love" + _name + " so much!"
评估为std::string
,因为该类包含双方+
的重载const char*
运算符,_name
为std::string
实例
但编译器不能对+
使用任何重载的"I love" + "Martin" + " so much!"
,因为这些只是const char[]
无效的内置+
文字,因此编译失败。
std::string() + "I love" + "Martin" + " so much!"
会起作用,就像采用C风格的编译时连接一样:
std::string("I love" "Martin" " so much!");
最后,如果在"love"
之后有空格,Martin可能会更加欣赏这条消息。
答案 1 :(得分:2)
"串"不是std::string
对象,它只是指向字符(char*
)的指针。如果您尝试在指针上使用operator+
,通常不会发生任何好事。
要连接几个旧式字符串,最好将其中一个明确地转换为std::string
:
std::string s = std::string("str") + "ing";
此外,由于c++14
您可以使用literal "s"将c样式字符串转换为std::string
:
auto s = "string"s; // has type std::string and contains data "string"
答案 2 :(得分:1)
字符串文字是const char[(whatever)]
,C ++中不允许连接const char[(whatever)]
。
答案 3 :(得分:0)
只要operator +的一个参数是std::string
,编译器就会在不使用括号的情况下解决它:
#include <string>
std::string expressAffectionFor(const std::string& name)
{
auto to_return = "I love" + name + " so much!";
return to_return;
}
当name
是指向(可能是const)字符的指针时,表达式没有明显的含义。
答案 4 :(得分:0)
字符串"Martin"
," so much!"
和const char*
属于_name
类型。我认为std::string
的类型为+
。
const char*
运算符未针对两个const char*
定义,但已为一个std::string
和一个const char*
定义。
在使用std::string
之前,您需要将+
个对象中的至少一个转换为+
。由于std::string* to_return = new std::string("I love" + "Martin" + std::string(" so much!"));
从右到左关联,因此请使用最后一个或第二个但最后一个对象:
author_id = db.Column(db.Integer, db.ForeignKey(Author.__table__.c.id))