簡體   English   中英

std :: in_place_t和C ++中的朋友17

[英]std::in_place_t and friends in C++17

截至編寫本文時,cppreference給出了std::in_place_t系列的一個相當簡單的定義

struct in_place_t {
    explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};

template <class T>
struct in_place_type_t {
    explicit in_place_type_t() = default;
};

template <class T>
inline constexpr std::in_place_type_t<T> in_place_type{};

template <size_t I> struct in_place_index_t {
    explicit in_place_index_t() = default;
};

template <size_t I>
inline constexpr in_place_index_t<I> in_place_index{};

但是, 從isocpp.org鏈接的最新C ++ 17標准草案有一個相當復雜的定義(第20.2.7節,第536頁):

struct in_place_tag {
    in_place_tag() = delete;
};
using in_place_t = in_place_tag(&)(unspecified );

template <class T>
using in_place_type_t = in_place_tag(&)(unspecified <T>);

template <size_t I>
using in_place_index_t = in_place_tag(&)(unspecified <I>);

in_place_tag in_place(unspecified );

template <class T>
in_place_tag in_place(unspecified <T>);

template <size_t I>
in_place_tag in_place(unspecified <I>);

第一個版本簡單易懂,但第二個版本對我來說非常不透明。 所以,問題:

  • 哪個版本是正確的,在Issaqua之后(2016年11月)? (可能是第二個,但是在最新的會議和cppreference之后,N4606可能還沒有更新。)

  • 顯然,這在某個時間點發生了變化; 有沒有人提到一篇提到變化的論文?

  • 最重要的是,任何人都可以解釋第二個版本的工作原理嗎? 示例實現是什么樣的?

目前,第一個版本是正確的版本,並且很可能是以C ++ 17結尾的版本。

第二個版本試圖允許一個人在in_place地方寫入in_place ,沒有任何東西,有類型或索引:

std::optional<int> o(std::in_place, 1);
std::any a(std::in_place<int>, 1);
std::variant<int, int> v(std::in_place<0>, 1);

使這種語法有效的唯一方法是使in_place成為重載函數,並且還需要為函數引用創建in_place*_t別名。 否則沒有真正的實現差異 - in_place函數不是要調用的,它們只是存在,以便對它們的引用可以作為標記傳遞並匹配相應的_t類型。

盡管如此,它太聰明並且引起了它自己的問題(例如,與普通標簽類型不同,它們對decay沒有很好的反應,而普通的std::in_place是一個重載的函數名稱,與完美的轉發器行為不端: std::optional<std::optional<int>> o(std::in_place, std::in_place);不起作用,因為編譯器無法解析第二個std::in_place ),所以它被取消了Issaquah,現在你必須寫

std::optional<int> o(std::in_place, 1);
std::any a(std::in_place_type<int>, 1);
std::variant<int, int> v(std::in_place_index<0>, 1);

不太漂亮,但更健全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM