Saya ingin dapat meneruskan std::array anonim ukuran variabel ke konstruktor:

using namespace std;

template <size_t N>
struct A
{
    array<string, N> const value;
    A (array<string, N>&& v): value {v} {}
};

Mencoba melewati array anonim seperti ini ...

A a { { "hello", "there" } };

Ini menghasilkan kesalahan berikut (menggunakan dentang ++):

kesalahan: tidak ada konstruktor atau panduan deduksi yang layak untuk pengurangan argumen templat 'A'

Jika saya tidak menggunakan template dan menentukan ukuran array dalam definisi, itu berfungsi:

struct A
{
    array<string, 2> const value;
    A (array<string, 2>&& v): value {v} {}
};

A a { { "hello", "there" } };

Apakah mungkin untuk menulis panduan deduksi untuk kasus ini? Jika demikian, bagaimana?
Jika tidak, bagaimana lagi saya bisa menyelesaikan masalah ini?

2
smeikx 18 Mei 2021, 00:47

1 menjawab

Jawaban Terbaik

Ini berfungsi untuk saya di gcc 11 dengan -std=c++17:

#include <string>
#include <array>

using namespace std;

template <size_t N>
struct A
{
    array<string, N> const value;
    A (array<string, N>&& v): value {v} {}
};

template<typename T, size_t N>
A( T (&&) [N]) -> A<N>;

A a { { "hello", "there" } };

Contoh langsung

3
Sam Varshavchik 17 Mei 2021, 21:55