Pertanyaan Bagian mana dari Perpustakaan Standar C ++ 14 yang dapat dan bagian mana yang akan dibuat constexpr?


Dengan yang baru santai C + + 14 aturan constexpr, pemrograman waktu kompilasi menjadi lebih ekspresif. Saya bertanya-tanya apakah Perpustakaan Standar juga akan ditingkatkan untuk mengambil keuntungan. Khususnya, std::initializer_list, std::pair, std::tuple, std::complex, std::bitset dan std::array tampak seperti kandidat utama untuk ditandai constexpr grosir

Pertanyaan:

  • bagian mana dari Perpustakaan Standar akan sekarang ditandai constexpr?
  • bagian mana yang lain bisa ditandai constexpr?
  • misalnya mengapa tidak dari fungsi <cmath> dan <algorithm> ditandai constexpr?
  • apakah ada alasan kompatibilitas mundur untuk tidak melakukannya?

32
2017-08-05 06:57


asal


Jawaban:


bagian mana dari Perpustakaan Standar sekarang akan ditandai constexpr?

Dari draft yang saya telah lihat untuk C ++ 14, N3690, berikut akan diubah menjadi constexpr sejauh ini (Dibandingkan dengan standar C ++ 11) †:

  • std::error_categorykonstruktor default
  • std::forward
  • std::move
  • std::move_if_noexcept
  • Semua std::pairperbandingan operator
  • std::get untuk std::pair dan std::tuple.
  • std::make_tuple
  • Semua std::tupleperbandingan operator
  • Semua std::optionalperbandingan operator
  • Semua std::optionalKonstruktor (simpan untuk bergerak)
  • operator[] dan size untuk std::bitset dan kontainer lainnya.
  • Semua std::complexperbandingan operator

Karena saya melakukan ini secara manual, Anda dapat mengharapkan beberapa kesalahan :(

Untuk daftar lain yang mungkin lebih tepat constexpr tambahan yang dapat Anda periksa: N3469, N3470, dan N3471

bagian lain mana yang bisa ditandai constexpr?

Sebagian besar barang itu bisa jadi constexpr (std::numeric_limits evaluasi, std::tuple dan std::pair konstruktor, dll) sudah ditandai sebagai constexpr dalam standar C ++ 11. Ada bug di mana std::ratiotitik waktu dan komponen lain tidak ditandai sebagai constexpr tapi itu diperbaiki di N3469.

Sesuatu yang akan diuntungkan constexpr tambahan akan menjadi std::initializer_list, yang tidak berhasil kali ini (dan saya tidak yakin apakah ada proposal untuk memperbolehkannya).

apakah ada alasan kompatibilitas mundur untuk tidak melakukannya?

Karena ini adalah sebuah perpanjangan, sebagian besar barang tidak akan rusak karena kode yang lebih lama masih akan dikompilasi seperti apa adanya dan tidak ada yang sekarang rusak. Namun menambahkan constexpr untuk hal-hal yang lebih tua yang tidak memilikinya dapat menyebabkan beberapa hasil yang mengejutkan jika Anda tidak mengharapkannya, seperti contohnya disediakan di sini (Terima kasih TemplateRex)


26
2017-08-05 07:16



Pekan lalu (23-28 September 2013) komite standar ditambahkan constexpr untuk lebih banyak rutinitas di perpustakaan standar.

  • forward_as_tuple
  • itu operator () metode semua operator perbandingan / logis / bitwise bernama. (less, greater, plus, minus, bitwise_and, logical_or, not1 - dan sisanya)

@TemplateRex: Kami semakin dekat untuk menyortir array pada waktu kompilasi.

Namun, kami juga menyelesaikan masalah LWG 2013, menyatakan bahwa pelaksana perpustakaan standar TIDAK memiliki kebebasan untuk melakukan panggilan yang tidak didefinisikan dalam standar sebagai constexpr sebagai constexpr, karena perbedaan antara implementasi semacam itu dapat mengubah perilaku beberapa kode.


4
2017-10-01 19:18