簡體   English   中英

std::forward 無法轉換大括號括起來的初始化列表

[英]std::forward cannot convert brace-enclosed initializer list

為什么 struct screen 不能正確初始化框架結構?

我想要的是初始化屏幕結構並直接初始化 2 幀結構。

#include <iostream>
#include <sstream>
#include <cstring>

#define ESC "\033"

struct frame {
  public:
    frame(unsigned int w, unsigned int h) :
      m_w(w),
      m_h(h) {}

  private:
    unsigned int m_w, m_h;
};

struct screen {
  public:
    template<typename ... Args>
      screen(Args && ... args0, Args && ... args1) :
        m_f0(std::forward<Args>(args0)...),
        m_f1(std::forward<Args>(args1)...) {}

  private:
    frame m_f0, m_f1;
};

int main() {
  frame f = {16, 16};

  screen s = {f, {16, 16}};

  return 0;
}

{16, 16}沒有類型。 如果在上下文中使用某個類型來初始化某物,則它會初始化該事物。

構造函數參數有一個類型。 推導出的模板構造函數參數從傳遞的參數中獲取它們的類型。 但是{16,16}沒有類型,所以它不能從缺少類型的東西推導出類型。

你的第二個問題是:

  template<typename ... Args>
  screen(Args && ... args0, Args && ... args1) :
    m_f0(std::forward<Args>(args0)...),
    m_f1(std::forward<Args>(args1)...) {}

C++ 不會在這里為您推斷Args... 如果它是函數調用中的最后一個參數,它只會推導出一個參數包,而這里的Args...既是最后一個又不是最后一個,因此不會被推導出。

現在你可以在某種程度上使用make from tuple

template<class...Args0, class...Args1>
screen( std::tuple<Args0...> args0, std::tuple<Args1...> args1 ):
  m_f0(std::make_from_tuple<frame>(std::move(args0))),
  m_f1(std::make_from_tuple<frame>(std::move(args1)))
{}

這讓你更接近(但不夠接近)。 在呼叫站點,您將執行以下操作:

screen s = {std::forward_as_tuple(f), std::forward_as_tuple(16, 16)};

它現在應該可以工作了。

這使用 ,但make_from_tuple可以早在C++14 中實現

暫無
暫無

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

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