![](/img/trans.png)
[英]Does std::bind work with move-only types in general, and std::unique_ptr in particular?
[英]Why does extern template instantiation not work on move-only types?
下面的代碼沒問題:
#include <memory>
#include <vector>
extern template class std::vector<int>;
template class std::vector<int>; // ok on copyable types
int main()
{
[[maybe_unused]] auto v1 = std::vector<int>{}; // ok
[[maybe_unused]] auto v2 = std::vector<std::unique_ptr<int>>{}; // ok
}
但是,以下編譯失敗:
#include <memory>
#include <vector>
extern template class std::vector<std::unique_ptr<int>>;
template class std::vector<std::unique_ptr<int>>; // error on move-only types
int main()
{
[[maybe_unused]] auto v1 = std::vector<int>{};
[[maybe_unused]] auto v2 = std::vector<std::unique_ptr<int>>{};
}
參見: https://godbolt.org/z/8qe94oGx5
為什么 extern 模板實例化不適用於僅移動類型?
顯式實例化定義(又名template class...
)將實例化所有成員函數(本身沒有模板化)。
除其他外,它將嘗試實例化向量的復制構造函數(以及其他需要可復制性的函數),並且由於顯而易見的原因而失敗。
可以使用requires
來防止它,但std::vector
不使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.