Enviar pesquisa
Carregar
Lambda in template_final
•
Transferir como PPTX, PDF
•
12 gostaram
•
4,415 visualizações
C
Cryolite
Seguir
Vista de apresentação de diapositivos
Denunciar
Compartilhar
Vista de apresentação de diapositivos
Denunciar
Compartilhar
1 de 72
Baixar agora
Recomendados
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
Recomendados
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
C++11
C++11
京大 マイコンクラブ
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
C++0x総復習
C++0x総復習
道化師 堂華
What is template
What is template
Akira Takahashi
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
error handling using expected
error handling using expected
Akira Takahashi
C++入門?
C++入門?
tsudaa
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
Implicit Explicit Scala
Implicit Explicit Scala
Kota Mizushima
エラーハンドリング
エラーハンドリング
道化師 堂華
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
C++ tips4 cv修飾編
C++ tips4 cv修飾編
道化師 堂華
boost - std - C#
boost - std - C#
Tatsuya Ishikawa
C++ lecture-0
C++ lecture-0
sunaemon
研究生のためのC++ no.4
研究生のためのC++ no.4
Tomohiro Namba
C++0x concept
C++0x concept
Akira Takahashi
Mais conteúdo relacionado
Mais procurados
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
C++11
C++11
京大 マイコンクラブ
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
C++0x総復習
C++0x総復習
道化師 堂華
What is template
What is template
Akira Takahashi
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
error handling using expected
error handling using expected
Akira Takahashi
C++入門?
C++入門?
tsudaa
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
Implicit Explicit Scala
Implicit Explicit Scala
Kota Mizushima
エラーハンドリング
エラーハンドリング
道化師 堂華
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
C++ tips4 cv修飾編
C++ tips4 cv修飾編
道化師 堂華
boost - std - C#
boost - std - C#
Tatsuya Ishikawa
C++ lecture-0
C++ lecture-0
sunaemon
Mais procurados
(20)
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
C++11
C++11
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
C++0x総復習
C++0x総復習
What is template
What is template
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
error handling using expected
error handling using expected
C++入門?
C++入門?
並行プログラミングと継続モナド
並行プログラミングと継続モナド
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Implicit Explicit Scala
Implicit Explicit Scala
エラーハンドリング
エラーハンドリング
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
C++ tips4 cv修飾編
C++ tips4 cv修飾編
boost - std - C#
boost - std - C#
C++ lecture-0
C++ lecture-0
Semelhante a Lambda in template_final
研究生のためのC++ no.4
研究生のためのC++ no.4
Tomohiro Namba
C++0x concept
C++0x concept
Akira Takahashi
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
C++14 Overview
C++14 Overview
Akira Takahashi
Emcpp item31
Emcpp item31
mitsutaka_takeda
More C++11
More C++11
京大 マイコンクラブ
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpoint
Logico
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
Masahiro Sakai
Prosym2012
Prosym2012
MITSUNARI Shigeo
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
Or seminar2011final
Or seminar2011final
Mikio Kubo
Nds meetup8 lt
Nds meetup8 lt
ushiboy
Boost tour 1_40_0
Boost tour 1_40_0
Akira Takahashi
C++の復習
C++の復習
Toshihiko Ando
Semelhante a Lambda in template_final
(20)
研究生のためのC++ no.4
研究生のためのC++ no.4
C++0x concept
C++0x concept
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
C++14 Overview
C++14 Overview
Emcpp item31
Emcpp item31
More C++11
More C++11
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpoint
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
Prosym2012
Prosym2012
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Or seminar2011final
Or seminar2011final
Nds meetup8 lt
Nds meetup8 lt
Boost tour 1_40_0
Boost tour 1_40_0
C++の復習
C++の復習
Mais de Cryolite
左と右の話
左と右の話
Cryolite
Allocators@C++11
Allocators@C++11
Cryolite
家に帰るまでが遠足です
家に帰るまでが遠足です
Cryolite
Destructive Call
Destructive Call
Cryolite
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
Cryolite
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
Cryolite
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
Cryolite
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Cryolite
Mais de Cryolite
(8)
左と右の話
左と右の話
Allocators@C++11
Allocators@C++11
家に帰るまでが遠足です
家に帰るまでが遠足です
Destructive Call
Destructive Call
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Lambda in template_final
1.
C++11 のラムダ式は なぜ関数テンプレートの戻り値 型やパラメタ型に現れることが できないのか? 2013/11/02 Cryolite C++
例外安全 Day 1
2.
そもそも Q. なぜラムダ式を関数テンプ レートの戻り値型やパラメタ 型に置きたいのか? 2
3.
そもそも Q. なぜラムダ式を関数テンプ レートの戻り値型やパラメタ 型に置きたいのか? A. C++
メタプログラミングに おいて死活問題だから. 3
4.
例題: std::is_constructible を実装しなさい 4
5.
例題: std::is_constructible を実装しなさい struct is_constructible<T,
Args…>: template<class T> typename add_rvalue_reference<T>::type create(); T t(create<Args>()...); がコンパイルできるかどうかを調べる. 5
6.
例題: std::is_constructible を実装しなさい struct is_constructible<T,
Args…>: template<class T> typename add_rvalue_reference<T>::type create(); T t(create<Args>()...); がコンパイルできるかどうかを調べる. Args... という型を持つ変数で型 T の コンストラクタを呼べるかどうか, をコンパイル時 bool 値として取り出す. 6
7.
答え (ラムダ式の出現に制限があ るとき): 実際に GCC
(libstdc++) 4.8.2 の 実装を見てみましょう 7
8.
答え (ラムダ式の出現に制限がな いとき): template<class T,
class... Args> constexpr decltype([] { T t(create<Args>()...); }, true) test(int) { return true; } template<class T> constexpr bool test(bool) { return false; } 8
9.
ここまでのまとめ: 9
10.
ここまでのまとめ: ラムダ式が関数テンプレートの戻 り値型やパラメタ型になれるかな れないかは, C++ メタプログラミ ングにおいて死活問題. 10
11.
ところが C++11 では ラムダ式の出現に制限がある! 11
12.
ところが C++11 では ラムダ式の出現に制限がある! (※ラムダ式は
constexpr ではない + ラムダ式は unevaluated operands に出現 できない) 12
13.
ところが C++11 では ラムダ式の出現に制限がある! (※ラムダ式は
constexpr ではない + ラムダ式は unevaluated operands に出現 できない) 何か理由があるはず! 13
14.
C++11 でラムダ式の出現に 制限がある理由: 14
15.
C++11 でラムダ式の出現に 制限がある理由: マングリングがしんどいから 15
16.
C++11 でラムダ式の出現に 制限がある理由: マングリングがしんどいから ……え? 16
17.
C++11 における関数 テンプレートのマングリング 2013/11/02 Cryolite C++
例外安全 Day 17
18.
マングリングの例 void f(int) { ..... } 18
19.
マングリングの例 void f(int) { $ ..... $ } g++ -std=c++
-c main.cpp nm main.o 0000000000000000 T _Z1fi $ c++filt _Z1fi f(int) 19
20.
マングリングの例 void f(int) { ..... } void f(double) { ..... } 20
21.
マングリングの例 void f(int) { ..... } $ g++
-std=c++ -c main.cpp $ nm main.o 0000000000000009 T _Z1fd 0000000000000000 T _Z1fi void f(double) $ c++filt _Z1fi { f(int) ..... $ c++filt _Z1fd } f(double) 21
22.
マングリングは 22
23.
マングリングは あるプログラム中に 共存することが許されている 異なるエンティティを 区別できないといけない 23
24.
マングリングの例 // a.cpp void f(int) { ..... } //
b.cpp int f(int) { ..... } 24
25.
マングリングの例 $ g++ -std=c++11
-c a.cpp // a.cpp void f(int) $ nm a.o 0000000000000000 T _Z1fi { $ c++filt _Z1fi ..... f(int) } // b.cpp int f(int) { ..... } $ g++ -std=c++11 -c a.cpp $ nm a.o 0000000000000000 T _Z1fi $ c++filt _Z1fi f(int) 25
26.
マングリングの例 $ g++ -std=c++11
-c a.cpp // a.cpp void f(int) $ nm a.o 0000000000000000 T a.o b.o $ g++ -std=c++11 -c _Z1fi { $ c++filt _Z1fi ..... (リンク時に定義の異なる関数に対す f(int) } るシンボルが衝突するので何が起きる か分からない) $ g++ -std=c++11 -c a.cpp // b.cpp が,元々 well-defined なプログラム $ nm a.o int f(int) じゃないのでそんなことは知ったこっ 0000000000000000 T _Z1fi { ちゃない! $ c++filt _Z1fi ..... f(int) } 26
27.
マングリングは あるプログラム中に 共存することが許されていない エンティティ同士を 区別できる必要はない 27
28.
まとめ:マングリングは あるプログラム中に 共存することが許されている 異なるエンティティを 区別できないといけない あるプログラム中に 共存することが許されていない エンティティ同士を 区別できる必要はない 28
29.
関数テンプレートの特殊化 に対するマングリングの例 template<typename T> void f(int) {} int
main() { f<int>(0); } 29
30.
関数テンプレートの特殊化 に対するマングリングの例 template<typename T> void f(int) {} $
g++ -std=c++11 -c main.cpp $ nm main.o int main() 0000000000000000 W _Z1fIiEvi { f<int>(0);$ c++filt _Z1fIiEvi void f<int>(int) } 30
31.
template<typename T> auto add(T
const &x, T const &y) 関数テンプレートの特殊化 -> decltype(x + y) {に対するマングリングの例 return x + y; } struct X { X operator+(X const &rhs) const { ..... } }; int main() { X x, y; add(x, y); } 31
32.
template<typename T> auto add(T
const &x, T const &y) 関数テンプレートの特殊化 -> decltype(x + y) {に対するマングリングの例 return x + y; } struct X { X g++ -std=c++11const &rhs) const $ operator+(X -c main.cpp { nm main.o $ ..... } }; 0000000000000000 W _Z3addI1XEDTplfp_fp0_ERKT_S4_ int main() { X x, y; add(x, y); } 32
33.
template<typename T> auto add(T
const &x, T const &y) 関数テンプレートの特殊化 -> decltype(x + y) {に対するマングリングの例 return x + y; } struct X { X g++ -std=c++11const &rhs) const $ operator+(X -c main.cpp { nm main.o $ ..... } }; 0000000000000000 W _Z3addI1XEDTplfp_fp0_ERKT_S4_ $ c++filt _Z3addI1XEDTplfp_fp0_ERKT_S4_ int main() { X x, y; add(x, y); } 33
34.
template<typename T> auto add(T
const &x, T const &y) 関数テンプレートの特殊化 -> decltype(x + y) {に対するマングリングの例 return x + y; } struct X { X g++ -std=c++11const &rhs) const $ operator+(X -c main.cpp { nm main.o $ ..... } }; 0000000000000000 W _Z3addI1XEDTplfp_fp0_ERKT_S4_ $ c++filt _Z3addI1XEDTplfp_fp0_ERKT_S4_ decltype int main()({parm#1}+{parm#2}) add<X>(X const&, X const&) { X x, y; add(x, y); } 34
35.
関数テンプレートの特殊化 に対するマングリング template<typename T> auto add(T
const &x, T const &y) -> decltype(x + y) { return x + y; } 35
36.
関数テンプレートの特殊化 に対するマングリング template<typename T> auto add(T
const &x, T const &y) -> decltype(x + y) { return x + y; } 36
37.
関数テンプレートの特殊化 に対するマングリング template<typename T> auto add(T
const &x, T const &y) -> decltype(x + y) { return x + y; } T = X の特殊化をマングリング decltype ({parm#1}+{parm#2}) add<X>(X const&, X const&) 37
38.
関数テンプレートの特殊化 に対するマングリング template<typename T> auto add(T
const &x, T const &y) -> decltype(x + y) { return x + y; } T = X の特殊化をマングリング decltype ({parm#1}+{parm#2}) add<X>(X const&, X const&) 戻り値の型やパラメタ型に現れる式を そのままエンコード 38
39.
関数テンプレートの特殊化 に対するマングリング template<typename T> auto add(T
const &x, T const &y) -> decltype(x + y) { return x + y; } T = X の特殊化をマングリング なぜ??? decltype ({parm#1}+{parm#2}) add<X>(X const&, X const&) 戻り値の型やパラメタ型に現れる式を そのままエンコード 39
40.
式をそのままマングリングって なんなの? 馬鹿なの? 死ぬ の? decltype
({parm#1}+{parm#2}) add<X>(X const&, X const&) 40
41.
式をそのままマングリングって なんなの? 馬鹿なの? 死ぬ の? decltype
({parm#1}+{parm#2}) add<X>(X const&, X const&) 1つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる 41
42.
式をそのままマングリングって なんなの? 馬鹿なの? 死ぬ の? decltype
({parm#1}+{parm#2}) add<X>(X const&, X const&) 1つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる 2つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる 42
43.
式をそのままマングリングって なんなの? 馬鹿なの? 死ぬ の? decltype
({parm#1}+{parm#2}) add<X>(X const&, X const&) 1つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる 2つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる ゆえにX constの左辺値とX constの左辺値との operator+の戻り値型も特殊化の時点で分かる 43
44.
式をそのままマングリングって なんなの? 馬鹿なの? 死ぬ の? decltype
({parm#1}+{parm#2}) add<X>(X const&, X const&) 疑問: 1つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる add<X>(X const&, X const&) を X マングリングすればええやん??? 2つ目のパラメタが X const の左辺値だと 特殊化の時点で分かる 戻り値の型やパラメタ型に現れる ゆえにX constの左辺値とX constの左辺値との 定数式や型の計算を全部やった結果を operator+の戻り値型も特殊化の時点で分かる マングリングすればええやん??? 44
45.
関数テンプレートの特殊化に対 して,なぜ戻り値型やパラメタ 型に現れる定数式や型計算を行 わずにマングリングするのか? 2013/11/02 Cryolite C++ 例外安全
Day 45
46.
まとめ:マングリングは あるプログラム中に 共存することが許されている 異なるエンティティを 区別できないといけない あるプログラム中に 共存することが許されていない エンティティ同士を 区別できる必要はない 46
47.
まとめ:マングリングは あるプログラム中に 可能性1: 共存することが許されている 関数テンプレートの戻り値型やパラメタに表れる定 数式や型の計算をしてからマングリングすると区別 異なるエンティティを すべきものが区別できなくなる 区別できないといけない あるプログラム中に 共存することが許されていない エンティティ同士を 区別できる必要はない 47
48.
まとめ:マングリングは あるプログラム中に 可能性1: 共存することが許されている 関数テンプレートの戻り値型やパラメタに表れる定 数式や型の計算をしてからマングリングすると区別 異なるエンティティを すべきものが区別できなくなる 区別できないといけない あるプログラム中に 可能性2: 共存することが許されていない GCC が従っているマングリング規則は区別する必要 のないものを区別できる余分な能力を持っている エンティティ同士を 区別できる必要はない 48
49.
まとめ:マングリングは あるプログラム中に 可能性1: 共存することが許されている 関数テンプレートの戻り値型やパラメタに表れる定 数式や型の計算をしてからマングリングすると区別 正解 異なるエンティティを すべきものが区別できなくなる 区別できないといけない あるプログラム中に 可能性2: 共存することが許されていない GCC が従っているマングリング規則は区別する必要 のないものを区別できる余分な能力を持っている エンティティ同士を 区別できる必要はない 49
50.
関数テンプレートの特殊化 に対するマングリングのま とめ 関数テンプレートの特殊化に対して戻 り値型やパラメタ型に現れる定数式や 型の計算をしてからマングリングする と区別すべきものが区別できなくなる 50
51.
関数テンプレートの特殊化 に対するマングリングのま とめ 関数テンプレートの特殊化に対して戻 り値型やパラメタ型に現れる定数式や 型の計算をしてからマングリングする と区別すべきものが区別できなくなる 名前,テンプレート引数,戻り値の型, パラメタの型のすべてが同じであるよう な,複数の関数テンプレートの特殊化が1 つのプログラム内で共存できる場合があ る 51
52.
名前,テンプレート引数,戻り 値の型,パラメタの型のすべて が同じであるような関数テンプ レートの特殊化が複数共存する ような well-defined なプログ ラムとは? 2013/11/02
Cryolite C++ 例外安全 Day 52
53.
// generic_add.hpp 思い出そう:マングリング template<typename T> は auto
generic_add(T const &x, T const &y) -> decltype(x + y) { return x + y; } template<typename T> auto generic_add(T const &x, T const &y) -> decltype(add(x, y)) { return add(x, y); } 53
54.
// generic_add.hpp T に
operator+ が宣言されている 場合のバージョン 思い出そう:マングリング template<typename T> は auto generic_add(T const &x, T const &y) -> decltype(x + y) { } return x + y;T に非メンバ関数 add が 宣言されている場合のバージョン template<typename T> auto generic_add(T const &x, T const &y) -> decltype(add(x, y)) { return add(x, y); } 54
55.
// generic_add.hpp T に
operator+ が宣言されている 場合のバージョン 思い出そう:マングリング template<typename T> は auto generic_add(T const &x, T const &y) -> decltype(x + y) { } return x + y;T に非メンバ関数 add が 宣言されている場合のバージョン template<typename T> auto generic_add(T const &x, T const &y) 異なる関数テンプレート定義からインスタンス -> decltype(add(x, y)) { 化された特殊化は,たとえ名前,テンプレート 引数,戻り値の型,パラメタの型のすべてが同 return add(x, y); じであっても共存できる } 55
56.
// x.hpp Struct X
..... // a.cpp #include <x.hpp> #include <generic_add.hpp> // b.cpp #include <x.hpp> #include <generic_add.hpp> X operator+(X const &x, X const &y) { ..... } X add(X const &x, X const &y) { ..... } void f() { X x; X y; generic_add(x, y); } void g() { X x; X y; generic_add(x, y); } 56
57.
// x.hpp Struct X
..... // a.cpp #include <x.hpp> #include <generic_add.hpp> // b.cpp #include <x.hpp> #include <generic_add.hpp> X add(X const &x, X operator+(X const &x, X const &y) X const &y) { { 異なる関数テンプレート定義をインスタンス化 ..... ..... 特殊化が共存可能 } } void f() { X x; X y; generic_add(x, y); } void g() { X x; X y; generic_add(x, y); } 57
58.
// x.hpp struct X
..... // a.cpp #include <x.hpp> #include <generic_add.hpp> // b.cpp #include <x.hpp> #include <generic_add.hpp> X add(X const &x, X operator+(X const &x, _Z11generic_addI1XET_RKS1_S3_ X const &y) X const &y) { 異なる関数テンプレート定義をインスタンス化 { decltype ({parm#1}+{parm#2}) ..... ..... generic_add<X>(X const&, X const&) 特殊化が共存可能 } } void f() { X x; X y; generic_add(x, y); } void g() { X x; X y; generic_add(x, y); } 58
59.
// x.hpp struct X
..... // a.cpp #include <x.hpp> #include <generic_add.hpp> // b.cpp #include <x.hpp> #include <generic_add.hpp> X add(X const &x, X operator+(X const &x, _Z11generic_addI1XET_RKS1_S3_ X const &y) X const &y) { 異なる関数テンプレート定義をインスタンス化 { decltype ({parm#1}+{parm#2}) ..... ..... generic_add<X>(X const&, X const&) 特殊化が共存可能 } } _Z11generic_addI1XEDTcl3addfp_fp0_EERKT_S4_ void g() void f() { { decltype (add({parm#1}, {parm#2})) X x; generic_add<X>(X const&, X const&) X x; X y; X y; generic_add(x, y); generic_add(x, y); } } 59
60.
// x.hpp struct X
..... // a.cpp #include <x.hpp> #include <generic_add.hpp> // b.cpp #include <x.hpp> #include <generic_add.hpp> X add(X const &x, X operator+(X const &x, _Z11generic_addI1XET_RKS1_S3_ X const &y) X const &y) { 異なる関数テンプレート定義をインスタンス化 { decltype ({parm#1}+{parm#2}) ..... ..... generic_add<X>(X const&, X const&) 特殊化が共存可能 } } _Z11generic_addI1XEDTcl3addfp_fp0_EERKT_S4_ void g() void f() { { decltype (add({parm#1}, {parm#2})) X x; generic_add<X>(X const&, X const&) X x; X y; X y; generic_add(x, y); generic_add(x, y); この2つの翻訳単位をリンクしても問題なし } } 60
61.
関数テンプレートの特殊化に対 するマングリングのまとめ 関数テンプレートの特殊化 に対して,戻り値の型やパ ラメタ型に現れる定数式や 型の計算をせずにそのまま マングリングしなければな らない 61
62.
捕捉:実際に GCC が従っている ABI
はあらゆる式に対するマング リング規則を定めている http://mentorembedded.github. io/cxx-abi/abi.html#mangling 62
63.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけない 63
64.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけない 64
65.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが []() { ..... } 65
66.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが []() { ..... } ここに出てくる可能性がある,あらゆ る構文要素に対するマングリング規則 を決めなければならない 66
67.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが []() { ..... } ここに出てくる可能性がある,あらゆ る構文要素に対するマングリング規則 を決めなければならない 死 67
68.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが 68
69.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが シンボル名が,あらゆる関 数定義をエンコードできる 能力を有するようになる 69
70.
ラムダ式の出現に対する制限をなく すには,ラムダ式に対するマングリ ング規則を定めないといけないが シンボル名が,あらゆる関 数定義をエンコードできる 能力を有するようになる 意味不明 70
71.
C++11 のラムダ式は なぜ関数テンプレートの戻り値 型やパラメタ型に現れることが できないのか? (再掲) 2013/11/02
Cryolite C++ 例外安全 Day 71
72.
まとめ: • ラムダ式を関数テンプレートの戻り値型やパ ラメタ型のところに置きたい • でも,そうするとマングリングがしんどくな る.だからダメ –
定数式や型をそのままマングリングしないといけ ない – ラムダ式の場合,それがやばいことになる • なんでマングリングがそんなしんどいことに なるの? • そうしないとまずいような well-defined な プログラムが実際に存在しうるから 72
Baixar agora