SlideShare a Scribd company logo
1 of 26
Download to read offline
すごいconstたのしく使おう!
const usage guide for C++ beginners
@Regenschauer490
1
はじめに
自己紹介
 .sigure// (@Regenschauer490)
 関西の大学院生
 C++11歴8ヶ月の素人
 const教穏健派
内容:
 const の使い方を中心に、私が経験的に気づいたことを
コード例と一緒に説明していきます。
 右下に「ここまでする必要があるのか?」を表すレベルを
私個人で恣意的につけてみました。
※ Lv 0 は C++を使う上で是非とも守るべきだと思うものです
2
const 概要
cv修飾子の一種
 const 修飾子 : 変数の値を変更できないよう指示
 volatile 修飾子 : 最適化せずメモリへアクセスするよう指示
変数に対する修飾とメンバ関数に対する修飾がある
const 修飾された変数の宣言時には初期化が必要
変数に対する修飾子の位置は 「const T」 「T const」
どちらでもOK
3
定数
定数は, #define の代わりに constを使う
コンパイル時定数になるのは整数型だけ
その他は実行時定数となる
正直、定数は constexpr を使いましょう
4
const int N = 5; //コンパイル時定数
int ar1[N] = { 1, 2, 3, 4, 5 }; // Nは無くても可
array<int, N> ar2{ { 1, 2, 3, 4, 5 } }; // initializer-list
定数
ユーザ定義型(クラス)のconst変数の宣言
 暗黙のデフォルトコンストラクタだけではコンパイルエラー
自分で定義 or default指定 する必要がある
5
struct Hoge1{
string str_;
};
struct Hoge2{
string str_;
Hoge2() = default;
};
Hoge1 hoge1; // OK
Hoge1 const choge1; // error
Hoge2 hoge2; // OK
Hoge2 const choge2; // OK
関数の引数
T const& で引数をとる
 引数元の内容が変更されないことを保証
 Tがユーザ定義型(クラス)なら、値渡しより効率的
 戻り値でローカル変数の参照(or ポインタ)を返すのはNG!
 破棄されたローカル変数へアクセスしてしまう
 moveで返そう
 コンパイラが最適化してくれることもある(RVO/NRVO)
6
string AddGrass(string const& src){
auto tmp = src; // copy
tmp.append(“w”); //appendは非constな操作
return tmp; // move(tmp)
}
関数の引数
引数がプリミティブ型かユーザ定義型か分からない時
 関数の引数がtemplate型の場合どうする?
 boost::call_traits<T>::param_typeで最適な形へ変換
 boost::call_traits<int>::param_type // int const
 boost::call_traits<string>::param_type // string const&
 ただし、関数templateには型推論の問題で使いづらい(下例)
 クラスtemplateに対しては問題なく使える
7
template<typename T>
void Foo(typename boost::call_traits<T>::param_type value){}
Foo(1); // error : Tの型を推論できない
Foo<int>(1); // OK
メンバ関数
クラスの状態を変化させない(メンバ変数を書き換えない)
メンバ関数は、constメンバ関数にしよう
 constメンバ関数内では、メンバ変数は暗黙的にconst修飾される
 const修飾された変数は、 constでないメンバ関数を呼び出せない
 constメンバ関数内では、thisポインタもconst修飾される
8
class Hoge{
string hoge_;
public:
string Get () const{
hoge_ = ""; // error : string const
hoge_.append(""); // error : append() const{…}
SetString(""); // error : this->SetString(){…}
return hoge_;
}
void Set (string const& src) { hoge_ = src; }
};
メンバ関数
constメンバ関数のオーバーロード
 呼び出し元の変数(クラスオブジェクト)が・・・
const変数でない → 非constメンバ関数が呼び出される
const変数である → constメンバ関数が呼び出される
9
class ConstCheck {
public:
ConstCheck (){}
void Check (){ cout << "ないとき!" << endl; }
void Check () const{ cout << "あるとき!" << endl; }
};
ConstCheck ないとき;
ConstCheck const あるとき;
ないとき. Check(); //ないとき!
あるとき. Check(); //あるとき!
メンバ関数
mutable記憶クラス指定子
 constメンバ関数内でも、メンバ変数がconst修飾されなくなる
 主な使い道はクラス内部用キャッシュ
10
class Hoge{
mutable string hoge_; //よくない使い方
mutable vector<chrono::time_point<chrono::system_clock>> time_;
public:
string Get () const{
hoge_ = ""; // OK
hoge_.append(""); // OK
SetString(""); // error : this->SetString(){…}
time_.push_back(chrono::system_clock::now()); // OK
return hoge_;
}
void Set (string const& src) { hoge_ = src; }
};
constの連鎖性11
struct Hoge2{
string str_;
Hoge2() = default;
};
void Foo(Hoge2 const& v){
v.str_.append(“”); // error :v.str _はconst変数
}
 以上から分かるように、constは連鎖する(重要)
 const 変数・メンバ関数からは、アクセスするメンバ変数は
const修飾され、非constメンバ関数は呼び出せない。
 メンバ変数もconst修飾されていれば同様に制限がかかる。
オブジェクトの内側へどんどん伝搬していく
 const_cast や mutable で部分的に破ることはできる
constの連鎖性(代入)12
int a = 0;
int const b = 0;
int& ra = a; // OK
int const& cra = a; // OK
int& rb = b; // error
int const& crb = b; // OK
int d = cra; // copy: T const& -> T
int const& e = []()->int{ return 1; }(); // T(pvalue) -> T const&
 ポインタ・参照への代入時に、元の変数が・・・
const変数でない → ポインタ・参照のconst修飾は任意
const変数である → constポインタ・参照へのみ代入可
 非ポインタ・参照への代入は コピーが行われる
別の変数が新たに作られるので、元の連鎖には関係しない
ラムダ式
コピーキャプチャされた変数は暗黙的にconst修飾
 参照キャプチャされた変数は元のまま
mutableを付けるとコピーキャプチャでもconst修飾されない
13
ConstCheck hoge;
[hoge]{
hoge.Check(); //あるとき!
}();
[hoge]() mutable{
hoge.Check(); //ないとき!
}();
[&hoge]{
hoge.Check(); //ないとき!
}();
ポインタ
C++でポインタといえば shared_ptr
生ポインタ?なにそれ、おいしいの?
 とりあえず、生ポインタのconstからおさらい
14
ptr自体がconstか
ptrが指す先を
const扱いするか
T * const ptr
T & ref
○ ☓
T const * ptr ☓ ○
T const * const ptr
T const & ref
○ ○
※ ついでだから参照も入れときました
ポインタ
生ポインタと同じことがshared_ptrでもいえる
15
 shared_ptr<T> const じゃ中身の値を変更できてしまう!
※私も以前にやらかしてしまいました (^^;)
 typedef shared_ptr<string> StrPtr; とかしてるとやりがち
 typedef shared_ptr<string const> C_StrPtr; も一緒に定義しよう
ptr自体がconstか
ptrが指す先を
const扱いするか
shared_ptr<T> const ptr ○ ☓
shared_ptr<T const> ptr ☓ ○
shared_ptr<T const> const ptr ○ ○
ポインタ
実際にコンパイルして確認
16
ConstCheck a , b;
ConstCheck * const p1 = &a; // p1自体がconst
ConstCheck const * p2 = &b; // p2が指す先をconst扱い
p1 = &b; // error
p1->Check (); //ないとき!
p2 = &a;
p2->Check (); //あるとき!
shared_ptr<ConstCheck> const s1(make_shared<ConstCheck>());
shared_ptr<ConstCheck const> s2(make_shared<ConstCheck>());
s1 = make_shared<ConstCheck>(); // error
s1->Check (); //ないとき!
s2 = make_shared<ConstCheck>();
s2->Check (); //あるとき!
ポインタ
※ ポインタ・参照先が絶対に不変だとは保証しない
 指している先の変数自体は非constかもしれない
 constなポインタ・参照を通しての変更が不可というだけ
17
int a = 0;
int const& cra = a;
a = 1;
cout << cra << endl; // 1
shared_ptr<int> s1(make_shared<int>(0));
shared_ptr<int const> s2(s1);
*s1 = 1;
cout << *s2 << endl; // 1
ポインタ(特にshared_ptr)を使う時は常に意識しておこう
ポインタ
const_cast によるcv修飾子の除去
 constなポインタ・参照から、非constなポインタ・参照を得る
 逆にconst を明示的に付与することもできる
よくある使用例
 古いライブラリの関数へ引数を渡す時
 constメンバ関数の実装を非constメンバ関数で流用する時
 operator[]の実装を、operator[]constと統一したい時など
18
void Print(char* str){ printf("%s", str); }
string s = "example";
string const& crs = s;
string& rs = const_cast<string&>(crs);
rs = "change"; // OK
Print( const_cast<char*>(crs.c_str()) );
ポインタ
ただし、正しく使わないと未定義動作を引き起こす
 const_cast したい constポインタ(参照)の指す先が・・・
const変数でない → cast後に指す先を変更してもOK
const変数である → cast後に指す先を変更すると爆死
 そもそもconst_castを使う時点で設計ミス (とよく言われる)
※自分ではどうしようもない時以外、基本的に使わないでFA
19
int const b = 0; // 元の変数はconst
int const& crb = b;
int& rb = const_cast<int&>(crb);
rb = 1; // Undefined Behavior
ローカル変数
さて、constの重要さを十分理解していただけた所で、
次はローカル変数も可能な限りconstにしていきましょう
まずはあまりイケてないコードを見てみましょう
20
enum class Cookie { CHOCOLATE, GOLDEN, RED };
auto cookie (Cookie::CHOCOLATE);
string v1; //poor
If(cookie = Cookie::RED) v1 = “apocalypsis“; // == のミスでコンパイルエラーにならない
else v1 = "peace";
enum class Cookie { CHOCOLATE, GOLDEN, RED };
auto const cookie(Cookie::CHOCOLATE);
auto const v1 = cookie == Cookie::RED ? "apocalypsis" : "peace";
次にconstの恩恵を享受できるコードを見てみましょう
ローカル変数
他にも同様に見ていきましょう
21
vector<Cookie> cookies{ Cookie::CHOCOLATE, Cookie::GOLDEN, Cookie::RED };
int sum = 0; // poor
for(auto e : cookies){
sum += static_cast<int>(e);
}
vector<Cookie> const cookies{ Cookie::CHOCOLATE, Cookie::GOLDEN, Cookie::RED };
auto const sum = boost::accumulate(cookies, 0,
[](int const sum, Cookie const ck){ return sum + static_cast<int>(ck); }
);
★const意識したらコードがきれいになりました
(23歳 男性 大学院生)
ローカル変数
やむを得ずconstでない変数を作成する場合は、
ラムダ式で非const変数の生存スコープを制限しよう
22
auto const file_pass = “…”; //読み込むファイル
auto const data = [file_pass]{
vector<string> tmp; //後で追加するからconstにできない
string line;
ifstream ifs(file_pass);
while (ifs && getline(ifs, line)) tmp.push_back(line);
return move(tmp);
}();
ローカル関数・スコープを作ることの副産物として、
処理の区切りが自然と生まれ、変更もしやすくなる
ローカル変数23
 ローカル変数をconstにする主なメリット
 変数の使い回しを防ぎ、それぞれの変数の内容・役割を
明確にすることができる.
可読性もアップ↑↑
 ローカル関数・スコープを使うようになる.
処理単位毎にコードがまとまり、変更に強い
 forを使う機会が減り、STLのAlgorithmを使うようになる.
コードが見やすくスッキリ
戻り値
メンバ変数の参照を渡したい場合
 参照や shared_ptr を返す戻り値は const修飾しておこう
shared_ptr 以外では、元のインスタンスの生存期間に注意
 「メンバ変数を外部に晒すなんて・・・」 と一見思うかもしれ
ないが、const修飾しておけば外部からの変更はできない。
const_cast という があるので、絶対ではない
24
class CCMaker{
shared_ptr<ConstCheck> cc_;
public:
//外部からは Read Only な操作しかできない
shared_ptr<ConstCheck const> Get() const{ return cc_; }
};
不変性
コ ン ス ト
破 壊
ブレイカー
戻り値・引数
敬虔なconst教徒は, たとえ値返しでもconstを付ける
 定数・不変ということを強調したい意図がある?
 文法上は、あってもなくても同じ
敬虔なconst教徒は, たとえ値渡しでもconstを付ける
 関数中で同じ変数を使いまわすことは悪である
 ローカル変数と同じ思想
25
boost::optional<double const> const
Div(double const num, double const denom)
{
return denom
? boost::optional<double const>(num / denom)
: boost::none;
}
まとめ
const 付けるとミスが減る!
const 意識するとコードがスッキリする!
const のおかげで なんだか幸せになれました
などなど
縁の下の力持ち!な const さんと
みなさんもこれから仲良くしていきましょう
26

More Related Content

What's hot

unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!Unity Technologies Japan K.K.
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理DADA246
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発祐司 伊藤
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだTetsuya Kaneuchi
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 

What's hot (20)

unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 

Viewers also liked

Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Yasuhiko Yamamoto
 
slackを(大学の授業で)使おう
slackを(大学の授業で)使おうslackを(大学の授業で)使おう
slackを(大学の授業で)使おうMasanori Kado
 
オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話京大 マイコンクラブ
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミングseanchas_t
 
機械学習を学ぶための準備 その4 (行列の掛け算について) 試験問題 解答
機械学習を学ぶための準備 その4  (行列の掛け算について) 試験問題 解答機械学習を学ぶための準備 その4  (行列の掛け算について) 試験問題 解答
機械学習を学ぶための準備 その4 (行列の掛け算について) 試験問題 解答NHN テコラス株式会社
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyPOStudy
 
私はこうやってSlackを社内で流行らせました
私はこうやってSlackを社内で流行らせました私はこうやってSlackを社内で流行らせました
私はこうやってSlackを社内で流行らせましたNHN テコラス株式会社
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 

Viewers also liked (15)

よいコード、わるいコード
よいコード、わるいコードよいコード、わるいコード
よいコード、わるいコード
 
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
 
slackを(大学の授業で)使おう
slackを(大学の授業で)使おうslackを(大学の授業で)使おう
slackを(大学の授業で)使おう
 
オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話
 
Windows改造計画
Windows改造計画Windows改造計画
Windows改造計画
 
slackのログとりの話
slackのログとりの話slackのログとりの話
slackのログとりの話
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミング
 
機械学習を学ぶための準備 その4 (行列の掛け算について) 試験問題 解答
機械学習を学ぶための準備 その4  (行列の掛け算について) 試験問題 解答機械学習を学ぶための準備 その4  (行列の掛け算について) 試験問題 解答
機械学習を学ぶための準備 その4 (行列の掛け算について) 試験問題 解答
 
家庭で使うSlack
家庭で使うSlack家庭で使うSlack
家庭で使うSlack
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
 
私はこうやってSlackを社内で流行らせました
私はこうやってSlackを社内で流行らせました私はこうやってSlackを社内で流行らせました
私はこうやってSlackを社内で流行らせました
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 

Similar to すごいConstたのしく使おう!

Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorialkocha2012
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublishedYoichiro Sakurai
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Mitsuru Kariya
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Mitsuru Kariya
 

Similar to すごいConstたのしく使おう! (17)

C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
C++11
C++11C++11
C++11
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
 
app-c.odp
app-c.odpapp-c.odp
app-c.odp
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 

すごいConstたのしく使おう!