C++ 这是抛弃康斯特吗?

C++ 这是抛弃康斯特吗?,c++,casting,C++,Casting,我整个下午都在坚持上面的代码。C++底漆只给出一个类似的代码 const char cp[]="jkasdkasjsad"; string a=static_cast<string>(cp);//"const string a" also runs without any error 有人能告诉我我的密码合法吗?既然字符串a之前没有常量,我可以称之为cast-away-const吗 任何定义良好的类型转换(涉及低级常量的转换除外)都可以 使用静态类型转换请求。例如,我们可以强制使用

我整个下午都在坚持上面的代码。C++底漆只给出一个类似

的代码
const char cp[]="jkasdkasjsad";
string a=static_cast<string>(cp);//"const string a" also runs without any error
有人能告诉我我的密码合法吗?既然字符串a之前没有常量,我可以称之为cast-away-const吗

任何定义良好的类型转换(涉及低级常量的转换除外)都可以 使用静态类型转换请求。例如,我们可以强制使用表达式 通过将其中一个操作数强制转换为双精度浮点除法:

我对上面的描述感到困惑,那些涉及低级const的是什么意思?涉及作业的左侧还是右侧?
任何人都能救我。。非常感谢

在这种情况下根本没有真正的铸造

const char cp[]="jkasdkasjsad";
static_cast<string>(cp);
静态_cast将返回从cp构造的字符串类型的临时变量。因为,我想我们讨论的是,这个构造函数将被调用

string(cp);
构造字符串,其中的内容由 s指向的以null结尾的字符串。长度 字符串由第一个空字符决定


在这种情况下根本没有真正的演员

const char cp[]="jkasdkasjsad";
static_cast<string>(cp);
静态_cast将返回从cp构造的字符串类型的临时变量。因为,我想我们讨论的是,这个构造函数将被调用

string(cp);
构造字符串,其中的内容由 s指向的以null结尾的字符串。长度 字符串由第一个空字符决定

正在复制cp数组中的字符串,字符串变量不是常量

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );
cp衰减到指向cp数组第一个元素的指针

正在复制cp数组中的字符串,字符串变量不是常量

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

CP衰减到CP数组第一元素指针

< p>根据C++标准第5.2.9/4条:你的代码完全合法:

表达式e可以使用 如果声明不正确,则静态类型为静态类型; 对于一些发明的临时变量T8.5,它的格式是良好的。这个 这种显式转换的效果与执行 声明和初始化,然后使用临时变量 作为转换的结果

例如,T是std::string,e是cp。不会因为创建新对象而丢弃常量。与此相比:

std::string ab = cp;

根据C++标准的条款5.2.9/4,您的代码是完全合法的:

表达式e可以使用 如果声明不正确,则静态类型为静态类型; 对于一些发明的临时变量T8.5,它的格式是良好的。这个 这种显式转换的效果与执行 声明和初始化,然后使用临时变量 作为转换的结果

例如,T是std::string,e是cp。不会因为创建新对象而丢弃常量。与此相比:

std::string ab = cp;


但那个字符串变量是常量吗?因为它是从一个const char数组强制转换而来的,所以字符串变量不需要是const-因为它包含一个const char数组的副本。如果你写char*p=const\u castcp;那就是抛弃康斯特。现在有一个指向指向cp数组的非常量字符的指针。从技术上讲,该代码是合法的。不合法的是,然后写*p='b';。不过基本上,在学习C++的这一点上,你不想使用const_cast,好吧,我得离开一会儿。我10分钟后回来!!向上投票。谢谢你的努力,但我觉得我能更好地理解他的答案。很抱歉但那个字符串变量是常量吗?因为它是从一个const char数组强制转换而来的,所以字符串变量不需要是const-因为它包含一个const char数组的副本。如果你写char*p=const\u castcp;那就是抛弃康斯特。现在有一个指向指向cp数组的非常量字符的指针。从技术上讲,该代码是合法的。不合法的是,然后写*p='b';。不过基本上,在学习C++的这一点上,你不想使用const_cast,好吧,我得离开一会儿。我10分钟后回来!!向上投票。谢谢你的努力,但我觉得我能更好地理解他的答案。很抱歉但是我们不能通过字符串变量修改char数组,对吗?因为char是const-itselfno-我们不能,但原因是字符串有它自己的这个char数组的副本。简洁明了。所以我接受你的回答。谢谢你的努力!但是我们不能通过字符串变量修改char数组,对吗?因为char是const-itselfno-我们不能,但原因是字符串有它自己的这个char数组的副本。简洁明了。所以我接受你的回答。谢谢你的努力!这与常数int j=3没有区别;int q=int j;。这里不能丢弃常量。是的,只是复制初始化。也许我应该暂时停止读这本书。。。谢谢你的代码不合法。s没有定义
特林。你想让人们猜测它是什么,并根据这些猜测给你建议吗?这与const int j=3没有什么不同;int q=int j;。这里不能丢弃常量。是的,只是复制初始化。也许我应该暂时停止读这本书。。。谢谢你的代码不合法。字符串没有定义。你想让人们猜测它是什么,并根据这些猜测给你建议吗?谢谢你的努力!谢谢你的努力!