Const对复制构造函数重要吗? 我在DeV C++上运行这个程序,它显示了const的错误。但是在VisualStudio中,它工作得很好。现在const对复制构造函数很重要吗 #include<iostream> using namespace std; class Test { /* Class data members */ public: Test(Test &t) { /* Copy data members from t*/} Test() { /* Initialize data members */ } }; Test fun() { cout << "fun() Called\n"; Test t; return t; } int main() { Test t1; Test t2 = fun(); return 0; } #包括 使用名称空间std; 课堂测试 { /*类数据成员*/ 公众: Test(Test&t){/*从t*/}复制数据成员 Test(){/*初始化数据成员*/} }; 测试乐趣() { cout

Const对复制构造函数重要吗? 我在DeV C++上运行这个程序,它显示了const的错误。但是在VisualStudio中,它工作得很好。现在const对复制构造函数很重要吗 #include<iostream> using namespace std; class Test { /* Class data members */ public: Test(Test &t) { /* Copy data members from t*/} Test() { /* Initialize data members */ } }; Test fun() { cout << "fun() Called\n"; Test t; return t; } int main() { Test t1; Test t2 = fun(); return 0; } #包括 使用名称空间std; 课堂测试 { /*类数据成员*/ 公众: Test(Test&t){/*从t*/}复制数据成员 Test(){/*初始化数据成员*/} }; 测试乐趣() { cout,c++,class,oop,constructor,copy,C++,Class,Oop,Constructor,Copy,复制构造函数传统上被声明为 Foo(const Foo&); 因为假设副本不会改变其右侧的对象(至少一台好的复印机不应该改变它,对吗?) C++中,您不能将临时绑定到非代码> const 参考。VisualStudio使用非标准扩展,这就是为什么您的代码编译,但不应依赖非标准扩展。 不一定要让复制构造函数通过引用获取rhs,也可以通过引用获取rhs。但在这种情况下,您将无法从右值(临时值)执行复制初始化。复制构造函数传统上被声明为 Foo(const Foo&); 因为假设

复制构造函数传统上被声明为

Foo(const Foo&);
因为假设副本不会改变其右侧的对象(至少一台好的复印机不应该改变它,对吗?)

<标准> C++中,您不能将临时绑定到非代码> const 参考。VisualStudio使用非标准扩展,这就是为什么您的代码编译,但不应依赖非标准扩展。
不一定要让复制构造函数通过引用获取rhs,也可以通过引用获取rhs。但在这种情况下,您将无法从右值(临时值)执行复制初始化。

复制构造函数传统上被声明为

Foo(const Foo&);
因为假设副本不会改变其右侧的对象(至少一台好的复印机不应该改变它,对吗?)

<标准> C++中,您不能将临时绑定到非代码> const 参考。VisualStudio使用非标准扩展,这就是为什么您的代码编译,但不应依赖非标准扩展。
不一定要让复制构造函数通过
const
reference获取rhs,也可以通过reference获取rhs。但在这种情况下,您将无法从右值(基本上是临时值)执行复制初始化。

这与复制构造函数无关。@juanchopanza是,在
main()中的第二行
使用复制初始化,但编译失败。@vsoftco是的,但问题与复制构造函数无关。我可以提供一个在矩阵求逆中发生相同错误的示例。一些(尤其是较旧的)编译器不强制约束绑定非
常量
引用(例如复制构造函数参数)到临时变量(例如
fun()
返回的
Test
)。没什么大不了的,只要修改代码,使复制构造函数通过引用
const
接受即可。VC++会尽力避免破坏旧代码,除非您为每个重复的答案提供特定的命令行选项。@juanchopanza起初我以为OP也在问,拥有一个接受其参数的复制构造函数是否合法。通过非常量引用。这与复制构造函数无关。@juanchopanza是的,
main()
中的第二行使用了复制初始化,但编译失败。@vsoftco是的,但问题与复制构造函数无关。我可以举一个例子,说明在矩阵求逆过程中会出现相同的错误。一些(尤其是旧的)编译器不强制限制将非
常量
引用(如复制构造函数参数)绑定到临时变量(如
fun()
返回的
测试
)。没什么大不了的,只要修改代码,使复制构造函数通过引用
const
接受即可。VC++会尽力避免破坏旧代码,除非您为每个重复的答案提供特定的命令行选项。@juanchopanza起初我以为OP也在问,拥有一个接受其参数的复制构造函数是否合法。通过非常量引用。