Pengikatan terstruktur pada const

Apakah kode berikut seharusnya dikompilasi?

#include <type_traits>

void foo() {
  const std::pair<int, int> x = {1, 2};

  auto [a, b] = x;

  static_assert(std::is_const_v<decltype(a)>);
  static_assert(std::is_const_v<decltype(b)>);
}
  • MSVC mengatakan "ya!".
  • GCC mengatakan "oh tidak, kawan!".
  • Dentang mengatakan "tidak mungkin!".

Jadi, apakah ini merupakan bug MSVC?

Standarnya tidak jelas di sini (saya telah melihat sekilas), tetapi mengingat aturan untuk auto, saya kira, a dan b harus disalin dengan membuang cv-qualifier.


person BiagioF    schedule 24.03.2019    source sumber


Jawaban (2)


Apakah kode berikut seharusnya dikompilasi?

Bukan itu. Ini adalah bug MSVC.

Deklarasi pengikatan terstruktur memperkenalkan nama baru (hanya untuk spesifikasi), e, yang dinyatakan seperti:

auto e = x;

Tipe e disebut E, dan karena penginisialisasinya mirip tupel, tipe pengikatannya diberikan oleh tuple_element_t<i, E>. Dalam hal ini E adalah pair<int, int>, jadi kedua tipe tersebut hanyalah int. Aturan untuk decltype pengikatan terstruktur adalah memberikan tipe yang direferensikan , jadi decltype(a) dan decltype(b) keduanya int.

Bagian penting di sini adalah a dan b (binding terstruktur) berasal dari variabel yang diciptakan (e), dan bukan penginisialisasinya (x). e bukan const karena Anda baru saja mendeklarasikannya auto. Apa yang kami lakukan adalah menyalin x, dan kemudian mengikat ke dalam salinan (non-const) ini.

person Barry    schedule 24.03.2019

Pernyataan statis dalam kode Anda seharusnya gagal. Mengapa? Karena kode Anda pada dasarnya sama dengan kasus:

#include <type_traits>

void foo() {
  const int x_1 = 1;
  const int x_2 = 2;

  auto a = x_1;
  auto b = x_2;

  static_assert(std::is_const_v<decltype(a)>);
  static_assert(std::is_const_v<decltype(b)>);
}

yang mana memang gagal di MSVC juga.

Dalam C++, tipe ekspresi meluruh berdasarkan tugas: auto melihat int, bukan const int. Pengikatan terstruktur memungkinkan Anda melakukan lebih dari satu auto pengikatan dalam satu waktu.

... dan fakta bahwa MSVC tidak gagal dalam pernyataan dalam kode Anda tampaknya merupakan bug.

person einpoklum    schedule 24.03.2019