3

当使用 auto 并提交到特定类型时,复制省略的确切规则是什么?(请参阅:GotW - 几乎总是自动)。

据我了解,移动/复制构造函数必须是可访问的,即使它不常用。但是,在下面的示例中, unique_ptrfstream之间有什么区别?(与noexcept 有关?)

#include <memory>
#include <fstream>

int main()
{
    auto f = std::fstream{"foo.bar"};
    auto i = std::unique_ptr<int>{new int};

    return 0;
}


// main.cc:6:10: error: call to implicitly-deleted copy constructor of 'std::basic_fstream<char>'
//    auto f = std::fstream{"foo.bar"};
//         ^   ~~~~~~~~~~~~~~~~~~~~
4

2 回答 2

3

我猜你用libstdc++. 它目前在这方面不符合标准,即iostreams 还没有移动构造函数,尽管它们应该有。它将在版本 5 中修复:

运行时库 (libstdc++)

...

完全支持 C++11,包括以下新特性:

...

可移动和可交换的 iostream 类;

来自版本 5 的变更日志

于 2015-02-25T02:15:47.940 回答
2

auto演绎和复制省略与此无关;您的代码与以下内容相同:

std::fstream f = std::fstream{"foo.bar"};
std::unique_ptr<int> i = std::unique_ptr<int>{new int};

在这两种情况下,这都指定了一个复制/移动操作,这意味着如果移动构造函数可用,则使用移动构造函数,否则使用复制构造函数。

正如您所说,即使在实践中会省略复制/移动,但标准要求代码在没有省略的情况下符合标准要求。(这是为了使正确的代码不会神秘地编译,然后根据优化决策等无法编译。)

显然,C++11 指定fstream应该有一个移动构造函数,但您的实现还没有真正实现它。

于 2015-02-25T02:16:15.993 回答