首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >难以理解副本构造函数从何而来

难以理解副本构造函数从何而来
EN

Stack Overflow用户
提问于 2010-10-08 04:43:05
回答 2查看 144关注 0票数 2

我有以下小代码:

代码语言:javascript
运行
复制
template <typename T>
class V
{
    public:
        T x;

    explicit V(T & _x)
    :x(_x){}

};

int main()
{
    V<float> b(1.0f); // fails
    return 0;
}

而它碰巧失败了。g++ 4.4.5返回的消息是:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"

../main.cpp: In function ‘int main()’:

../main.cpp:19: error: no matching function for call to ‘V<float>::V(float)’

../main.cpp:10: note: candidates are: V<T>::V(T&) [with T = float]

../main.cpp:6: note: V<float>::V(const V<float>&)

问题是..。第二个构造函数是从哪里来的?我真的不知道..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-08 04:49:58

其他的答案会讨论为什么会出现编译时失败(这是大多数问题的主要问题,当这些失败是问题中最突出的部分时)。然而。关于您的明确问题,“第二个构造函数从何而来?”:

12.8/4标准的“复制类对象”说:

如果类定义没有显式声明副本构造函数,则将隐式声明一个副本构造函数。

如果您想避免使用隐式复制器,可以使用少数几个“不可复制”成语中的一个(如boost::noncopyable):http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin

票数 6
EN

Stack Overflow用户

发布于 2010-10-08 04:51:44

编译器已经向类提供了一个复制构造函数和赋值操作符。它试图将复制构造函数与main中的语句匹配。这段代码的问题在于,在类V的构造函数中,您将参数作为非const引用。当您执行V<float> b(1.0f)时,编译器将为值1.0f创建一个类型为float的未命名临时变量。但是,这个未命名的临时引用不能绑定到非const引用,它只能绑定到const引用。因此,您需要将构造函数签名更改为explicit V(const T & _x)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3887759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档