N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(43) 5.2.11 Const cast [expr.const.cast] p116

はじめに

N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

list

N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

Compiler

clang++ --version

clang version 6.0.0 (tags/RELEASE_600/final)

g++-7 --version

g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

(43) 5.2.11 Const cast [expr.const.cast]

p116

p116.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p116.cpp (43) 5.2.11 Const cast [expr.const.cast]"

#include <iostream>

typedef int *A[3]; // array of 3 pointer to int
typedef const int *const CA[3]; // array of 3 const pointer to const int
CA &&r = A{}; // OK, reference binds to temporary array object after qualification conversion to type CA
A &&r1 = const_cast<A>(CA{}); // error: temporary array decayed to pointer
A &&r2 = const_cast<A&&>(CA{}); // OK


int main(int argc, char *argv[], char *envp[]){

  std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
$ ./cppgl17.sh p116
$ clang++ p116.cpp
p116.cpp:9:6: error: reference to type 'CA' (aka 'const int *const [3]') could not bind to an rvalue of type 'A' (aka 'int *[3]')
CA &&r = A{}; // OK, reference binds to temporary array object after qualification conversion to type CA
     ^   ~~~
p116.cpp:10:10: error: const_cast to 'A' (aka 'int *[3]'), which is not a reference, pointer-to-object, or pointer-to-data-member
A &&r1 = const_cast<A>(CA{}); // error: temporary array decayed to pointer
         ^~~~~~~~~~~~~~~~~~~
p116.cpp:11:10: error: const_cast from rvalue to reference type 'A &&' (aka 'int *(&&)[3]')
A &&r2 = const_cast<A&&>(CA{}); // OK
         ^~~~~~~~~~~~~~~~~~~~~
3 errors generated.

$ g++-7 p116.cpp
p116.cpp:9:12: error: invalid initialization of reference of type 'const int* const (&&)[3]' from expression of type 'A {aka int* [3]}'
 CA &&r = A{}; // OK, reference binds to temporary array object after qualification conversion to type CA
            ^
p116.cpp:10:28: error: invalid use of const_cast with type 'A {aka int* [3]}', which is not a pointer, reference, nor a pointer-to-data-member type
 A &&r1 = const_cast<A>(CA{}); // error: temporary array decayed to pointer
                            ^
p116.cpp:11:30: error: invalid const_cast from type 'const int* const (*)[3]' to type 'int* (*)[3]'
 A &&r2 = const_cast<A&&>(CA{}); // OK
                              ^

検討事項

 コンパイルエラーにならない修正。
 内容の出力。
 g++とclang++のエラーの違いの説明。

参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

文書履歴

0.10 初稿 2080415

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.