はじめに
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.
#(47)5.4 Explicit type conversion (cast notation) [expr.cast]
p128
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
#define msg "p128.cpp(47)5.4 Explicit type conversion (cast notation) [expr.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 << "p1="<<p1 <<" q1=" << q1 << " pi1="<<pi1<<" pci1="<<pci1<<std::endl;
std::cout << msg << std::endl;
return EXIT_SUCCESS;
}
$ ./cppgl17.sh p128
$ clang++ p128.cpp
p128.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
^ ~~~
p128.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
^~~~~~~~~~~~~~~~~~~
p128.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 p128.cpp
p128.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
^
p128.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
^
p128.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
文書履歴
ver. 0.10 初稿 2080415
ver. 0.11 URL追記 20230215
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.