C++ 即使提供了确切的参数,也会忽略显式复制构造函数

C++ 即使提供了确切的参数,也会忽略显式复制构造函数,c++,copy-constructor,explicit,C++,Copy Constructor,Explicit,已提供复制构造函数。使用它时,会将完全相同的类型传递给参数。不过,编译器(gcc/g++4.8.2)似乎忽略了显式复制构造函数的存在。 代码生成编译错误。为什么? 错误是: t.cpp: In function ‘A f(const A&)’: t.cpp:19:12: error: no matching function for call to ‘A::A(const A&)’ return a; //compilation error with gcc 4.8.

已提供复制构造函数。使用它时,会将完全相同的类型传递给参数。不过,编译器(gcc/g++4.8.2)似乎忽略了显式复制构造函数的存在。 代码生成编译错误。为什么? 错误是:

t.cpp: In function ‘A f(const A&)’:
t.cpp:19:12: error: no matching function for call to ‘A::A(const A&)’
     return a;  //compilation error with gcc 4.8.2
            ^
t.cpp:19:12: note: candidate is:
t.cpp:14:5: note: A::A()
     A(){}
     ^
t.cpp:14:5: note:   candidate expects 0 arguments, 1 provided
t.cpp:21:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
我已经经历了
及 . 基于这些链接,我尝试了强制复制构造(为了避免优化,请参阅我的注释代码)

#包括
使用名称空间std;
甲级
{
公众:
显式A(const A&A)//显式复制构造函数
//A(const A&)//一个复制构造函数,几乎是默认构造函数。
//使用它可以解决任何编译问题。
{

cout在返回时(以及按值传递参数时)隐式调用复制构造函数

此代码将调用复制构造函数两次:

A f(const A &a)
{   
    return A(a);
}
A(A)
表示显式复制,然后返回隐式复制

如果不允许隐式复制,则也不能通过复制返回。必须通过引用或指针返回(可能带有
新的
'd副本)



在C++11及更高版本中,我相信上面的代码会为返回调用move构造函数(如果已定义)(尽管它仍然会为显式调用调用copy构造函数),这应该更有效。

为什么需要显式复制构造函数?也许启用某些优化级别会使复制消失。我不想通过程序实现任何目标。这是为了更好地理解复制构造函数本身。抱歉,如果structor不是显式的,但是隐式使用显式构造函数在语法上仍然是不正确的,因此它仍然不会编译,但我看不出您实际上提到了错误是什么。错误通常在文本中有很好的信息。请发布准确的编译错误。+1“A(A)
表示显式复制,然后在返回时有隐式复制。”标准谈到复制到函数的返回值(或移动)例如,从通过
A(A)
创建的临时文件复制到从函数
f
返回的临时文件中。当return语句中的表达式隐式转换为返回类型时,会发生这种情况;这种转换是复制初始化,需要一个非显式的构造函数。术语“复制初始化”的使用在“DyP”中的注释使我理解了它。我在internet上搜索发现:复制初始化是在以下情况下执行的:1)当命名变量(自动、静态或线程本地)时使用由等号后跟表达式组成的初始值设定项声明。2)当通过值向函数传递参数时3)复制初始化的权限小于直接初始化:复制初始化仅考虑非显式构造函数和用户定义的转换函数。
A f(const A &a)
{   
    return A(a);
}