这个铸造是不是const?

时间:2015-12-28 10:35:15

标签: c++ casting

const char cp[]="jkasdkasjsad";
string a=static_cast<string>(cp);//"const string a" also runs without any error

我整个下午都坚持使用上面的代码。 C ++ Primer只提供类似

的代码
const char cp[]="jkasdkasjsad";
static_cast<string>(cp);

有人能告诉我我的代码合法吗?我可以称之为&#34;抛弃const&#34;因为没有&#34; const&#34;之前&#34;字符串a&#34;?

  

任何明确定义的类型转换,除了那些涉及低级const的转换,都可以   请求使用static_cast。例如,我们可以强制使用表达式   通过将其中一个操作数强制转换为浮点除法:

我对上面的描述感到困惑,那些&#34;那些涉及低级const&#34;意思?涉及作业的左侧或右侧? 任何人都可以救我..非常感谢!

3 个答案:

答案 0 :(得分:2)

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

static_cast<string>(cp);

相当于调用字符串构造函数

string(cp);

string构建的cp类型的临时变量将从static_cast返回。因为,我认为我们谈论的是std::string,而这个构造函数将被称为

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

构造字符串,其中包含使用。的副本初始化的内容   s指向的以null结尾的字符串。的长度   string由第一个空字符决定。

答案 1 :(得分:2)

正在复制const char cp[] = "jkasdkasjsad"; std::string a = static_cast<std::string>(cp); 数组中的字符串,字符串变量不是const

std::string ab = cp;

相当于:

cp

cp衰减到指向Version=1 EventType=CLR20r3 ... snip ... Sig[0].Name=問題の署名 01 Sig[0].Value=myapp.exe Sig[1].Name=問題の署名 02 Sig[1].Value=2.2.0.1 Sig[2].Name=問題の署名 03 Sig[2].Value=541bc264 Sig[3].Name=問題の署名 04 Sig[3].Value=System Sig[4].Name=問題の署名 05 Sig[4].Value=2.0.0.0 Sig[5].Name=問題の署名 06 Sig[5].Value=4a275e12 Sig[6].Name=問題の署名 07 Sig[6].Value=2919 Sig[7].Name=問題の署名 08 Sig[7].Value=ef Sig[8].Name=問題の署名 09 Sig[8].Value=System.IO.IOException ... snip ... 数组

的第一个元素

答案 2 :(得分:1)

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

  

可以使用a将表达式Array ( [result] => error [msg] => 0 - This email address looks fake or invalid. Please enter a real email address. ) 显式转换为类型e   如果声明Tstatic_cast形式的static_cast<T>(e)   对于一些发明的临时变量t(8.5),其形式良好。该   这种显式转换的效果与执行相同   声明和初始化然后使用临时变量   作为转换的结果。

对于您的示例T t(e);Tstd::stringe。由于新对象的创建,没有强制转换constness。与此相比:

cp