首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这不是复制初始化,是吗?

这不是复制初始化,是吗?
EN

Stack Overflow用户
提问于 2013-12-13 05:18:26
回答 1查看 489关注 0票数 7

在下面的代码中,我不允许声明一个显式的ctor,因为编译器说我在复制初始化上下文中使用它(clang3.3和gcc 4.8)。我试图通过使ctor不显式,然后声明复制构造函数被删除来证明编译器是错误的。

编译器是错的,还是有其他解释?

代码语言:javascript
复制
#include <iostream>

template <typename T>
struct xyz
{
    constexpr xyz (xyz const &)    = delete;
    constexpr xyz (xyz &&)         = delete;
    xyz & operator = (xyz const &) = delete;
    xyz & operator = (xyz &&)      = delete;
    T i;
    /*explicit*/ constexpr xyz (T i): i(i) { }
};

template <typename T>
xyz<T> make_xyz (T && i)
{
    return {std::forward<T>(i)};
}

int main ()
{
    //auto && x = make_xyz(7);
    auto && x (make_xyz(7)); // compiler sees copy-initialization here too
    std::cout << x.i << std::endl;
}

更新是一个不现实但却简单得多的版本

代码语言:javascript
复制
struct xyz {
    constexpr xyz (xyz const &) = delete;
    constexpr xyz (xyz &&) = delete;
    xyz & operator = (xyz const &) = delete;
    xyz & operator = (xyz &&) = delete;
    int i;
    explicit constexpr xyz (int i): i(i) { }
};

xyz make_xyz (int && i) {
    return {i};
}

int main () {
    xyz && x = make_xyz(7); 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-13 05:28:50

=表示法不应影响投诉,因为引用绑定的行为并没有不同,无论是直接初始化还是复制初始化。这里初始化的是返回值对象,它没有自己的名称。

不幸的是,GCC抱怨是对的,Clang也是如此。根据第6.6.3/2 stmt.return节,

带有大括号的返回语句通过从指定的初始化程序列表复制列表初始化(8.5.4)初始化从函数返回的对象或引用。

所以,在那里有一个看不见的=标志,你无法绕过它。

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

https://stackoverflow.com/questions/20559603

复制
相关文章

相似问题

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