2010-10-09 122 views
11

ISO/IEC 14882, Programming language – C++广泛阅读后我为什么需要const隐式转换为用户定义的类型与单个参数的构造类似于下面为什么const为隐式转换?

#include <iostream> 

class X { 
public: 
    X(int value) { 
     printf("constructor initialized with %i",value); 
    } 
} 

void implicit_conversion_func(const X& value) { 
    //produces "constructor initialized with 99" 
} 

int main (int argc, char * const argv[]) { 
    implicit_conversion_func(99); 
} 



第4线开始仍然不确定3

当且仅当声明T t = e时,才能将表达式e隐式转换为类型T;对于一些发明的临时变量t(8.5)来说是良构的。某些语言结构要求将表达式转换为布尔值。出现在这样的语境中的表达式e据说被上下文转换为bool,并且当且仅当声明bool t(e);对于一些发明的临时变量t(8.5)来说是良构的。隐式转换的效果与执行声明和初始化相同,然后使用临时变量作为转换的结果。如果T是左值引用类型(8.3.2),则结果为左值,否则为右值。当且仅当初始化将它用作左值时,表达式e被用作左值。

以下,我发现就有关用户定义的类型的初始化的部分在8.5线6

如果程序要求一个const限定的类型T,T的对象的默认的初始化应该是一个带有用户提供的默认构造函数的类类型。

最后,我结束了在12.3第2行有关用户定义的转换其中规定只有在它们是明确的(10.2,12.3.2)

用户定义的转换被应用。

不用说,10.2和12.3.2没有回答我的问题。

  1. 有人能摆脱对隐式转换什么样的影响const有一些轻?
  2. 使用const是否使每12.3行2的转换“明确”?
  3. const 会影响左值与左值在第4节中讨论过吗?
+1

难道你不喜欢C++吗? – 2010-10-09 04:02:15

回答

13

它与隐含的转换没有多大关系。此外,它与转换并没有多大关系。这实际上是右值左值

当您将99转换为X时,结果为右值。在C++中,转换结果总是rvalues(除非您转换为引用类型)。在C++中将非常量引用附加到右值是非法的。

例如,该代码不会编译

X& r = X(99); // ERROR 

,因为它试图一个非const参考附加到右值。另一方面,这个代码很好

const X& cr = X(99); // OK 

因为完全可以将一个const引用附加到一个右值。

同样的事情也发生在你的代码中。它涉及隐式转换的事实有点不恰当。你可以用一个明确的 一个

implicit_conversion_func(X(99)); 

替换隐式转换和相同的情况下结束了:与const它编译,没有const事实并非如此。

同样,转换(显式或隐式)在这里扮演的唯一角色是它可以帮助我们生成一个右值。在一般情况下,可以以其他方式产生一个右值,并遇到同样的问题

int &ir = 3 + 2; // ERROR 
const int &cir = 3 + 2; // OK 
+0

“_当你将99转换为X类型时,结果是一个右值。”#“**一个右值是一个表达式。**将99转换为”X“产生一个临时对象。 – curiousguy 2011-12-23 06:22:51

+0

@curiousguy:尽管“右值”的概念与表达式紧密相连,但术语“右值”可用于引用表达式本身以及其产生的结果。语言标准实际上比“右值表达”更经常地使用“右值结果”的概念。 (显然,两者实际上都是指同一件事)。此外,语言规范在5.2.3中清楚而明确地指出,功能样式的结果是一个右值。期。它也恰好是“一个临时对象”的事实在这里几乎没有关系。 – AnT 2011-12-24 20:27:39

+0

你能解释一下“右值”的含义吗? – curiousguy 2011-12-25 22:09:58

0

每节5.2.2条第5款,当一个参数传递给函数是const引用类型的,临时变量是自动如果需要引入。在你的例子中,X(99)的右值结果必须放入一个临时变量,以便该变量可以被const引用传递给implicit_conversion_func

+0

“__要将右值99放入临时变量中,以便该变量可以通过(const)引用传递给X_的构造函数”否。构造函数的参数通过值传递;没有对int的常量引用,也没有值为99的临时值。“_创建非const临时的语义在任何情况下都会相当混乱_”怎么样'std :: string()=“Hello,世界“'? – curiousguy 2011-12-23 06:28:03

+0

@curiousguy好点 - 我想我误读了OP。这个临时变量是一个'const X',它是通过用'99'作为参数来构造的,而不是'const int'来初始化的。它的要点仍然存在:创建一个'const'临时函数来满足'const&'参数。 – 2011-12-27 23:22:48

相关问题