#はじめに
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++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。
##作業方針
1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。
1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。
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)
Target: x86_64-apple-darwin17.4.0
###g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
#(144)12.6.3 Initialization by inherited constructor [class.inhctor.init]p299
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
#define msg "p299.cpp(144)12.6.3 Initialization by inherited constructor [class.inhctor.init]"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
struct B1 {
B1(int, ...) { }
};
struct B2 {
B2(double) { }
};
int get();
struct D1 : B1 {
using B1::B1; // inherits B1(int, ...)
int x;
int y = get();
};
void test() {
D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4),
// then d.x is default-initialized (no initialization is performed),
// then d.y is initialized by calling get()
D1 e; // error: D1 has a deleted default constructor
}
struct D2 : B2 {
using B2::B2;
B1 b;
};
D2 f(1.0); // error: B1 has a deleted default constructor
struct W {
W(int);
};
struct X : virtual W {
using W::W;
X() = delete;
};
struct Y : X {
using X::X;
};
struct Z : Y, virtual W {
using Y::Y;
};
Z z(0); // OK: initialization of Y does not invoke default constructor of X
template<class T> struct Log : T {
using T::T; // inherits all constructors from class T
~Log() {
std::clog << "Destroying wrapper" << std::endl;
}
};
struct A {
A(int);
};
struct B : A {
using A::A;
};
struct C1 : B {
using B::B;
};
struct C2 : B {
using B::B;
};
struct D1a : C1, C2 {
using C1::C1;
using C2::C2;
};
struct V1 : virtual B {
using B::B;
};
struct V2 : virtual B {
using B::B;
};
struct D2a : V1, V2 {
using V1::V1;
using V2::V2;
};
D1a d1(0); // ill-formed: ambiguous
D2a d2(0); // OK: initializes virtual B base class, which initializes the A base class
// then initializes the V1 and V2 base classes as if by a defaulted default constructor
struct M {
M();
M(int);
};
struct N : M {
using M::M;
};
struct O : M {};
struct P : N, O {
using N::N;
using O::O;
};
P p(0); // OK: use M(0) to initialize N’s base class,
// use M() to initialize O’s base class
int main() {
std::cout<< msg << std::endl;
return EXIT_SUCCESS;
}
$ ./cppgl17.sh p299
$ clang++ p299.cpp
p299.cpp:25:4: error: call to implicitly-deleted default constructor of 'D1'
D1 e; // error: D1 has a deleted default constructor
^
p299.cpp:15:13: note: default constructor of 'D1' is implicitly deleted because base class 'B1' has no default constructor
struct D1 : B1 {
^
p299.cpp:31:4: error: constructor inherited by 'D2' from base class 'B2' is implicitly deleted
D2 f(1.0); // error: B1 has a deleted default constructor
^
p299.cpp:29:4: note: constructor inherited by 'D2' is implicitly deleted because field 'b' has no default constructor
B1 b;
^
p299.cpp:55:5: error: constructor of 'A' inherited from multiple base class subobjects
D1a d1(0); // ill-formed: ambiguous
^
p299.cpp:47:11: note: inherited from base class 'C2' here
using C2::C2;
^
p299.cpp:46:11: note: inherited from base class 'C1' here
using C1::C1;
^
3 errors generated.
$ g++-7 p299.cpp
p299.cpp: In function 'void test()':
p299.cpp:21:13: sorry, unimplemented: passing arguments to ellipsis of inherited constructor 'D1::D1(int, ...) [inherited from B1]'
D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4),
^
p299.cpp:16:11: note: declared here
using B1::B1; // inherits B1(int, ...)
^~
p299.cpp:25:4: error: use of deleted function 'D1::D1()'
D1 e; // error: D1 has a deleted default constructor
^
p299.cpp:15:8: note: 'D1::D1()' is implicitly deleted because the default definition would be ill-formed:
struct D1 : B1 {
^~
p299.cpp:15:8: error: no matching function for call to 'B1::B1()'
p299.cpp:9:1: note: candidate: B1::B1(int, ...)
B1(int, ...) { }
^~
p299.cpp:9:1: note: candidate expects 1 argument, 0 provided
p299.cpp:8:8: note: candidate: constexpr B1::B1(const B1&)
struct B1 {
^~
p299.cpp:8:8: note: candidate expects 1 argument, 0 provided
p299.cpp:8:8: note: candidate: constexpr B1::B1(B1&&)
p299.cpp:8:8: note: candidate expects 1 argument, 0 provided
p299.cpp: At global scope:
p299.cpp:31:9: error: use of deleted function 'D2::D2(double) [inherited from B2]'
D2 f(1.0); // error: B1 has a deleted default constructor
^
p299.cpp:28:11: note: 'D2::D2(double) [inherited from B2]' is implicitly deleted because the default definition would be ill-formed:
using B2::B2;
^~
p299.cpp:28:11: error: no matching function for call to 'B1::B1()'
p299.cpp:9:1: note: candidate: B1::B1(int, ...)
B1(int, ...) { }
^~
p299.cpp:9:1: note: candidate expects 1 argument, 0 provided
p299.cpp:8:8: note: candidate: constexpr B1::B1(const B1&)
struct B1 {
^~
p299.cpp:8:8: note: candidate expects 1 argument, 0 provided
p299.cpp:8:8: note: candidate: constexpr B1::B1(B1&&)
p299.cpp:8:8: note: candidate expects 1 argument, 0 provided
p299.cpp:55:9: error: use of deleted function 'D1a::D1a(int) [inherited from A]'
D1a d1(0); // ill-formed: ambiguous
^
p299.cpp:46:11: note: 'D1a::D1a(int) [inherited from A]' inherits from multiple base subobjects
using C1::C1;
^~
#検討事項
コンパイルエラーをなくす修正
意味のある出力
#参考資料
N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1
コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74
C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed
ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1
C言語(C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a
C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9
'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11
Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc
MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb
どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00
MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671
#文書履歴
0.10 初稿 2080420