次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C++相談室 part141
■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
457デフォルトの名無しさん
2019/03/18(月) 21:59:25.97ID:MtU5H+Zb >>455
cocos2d
cocos2d
458デフォルトの名無しさん
2019/03/18(月) 22:47:37.12ID:DisgVN8i std::initializer_list<int> l()
{
return std::initializer_list<int>{1,2,3};
}
std::vector<int> v()
{
return std::vector<int>{1,2,3};
}
int main()
{
for(auto i : l()){
std::cout << i << endl;
}
for(auto i : v()){
std::cout << i << endl;
}
}
0
0
0
1
2
3
なんで?
{
return std::initializer_list<int>{1,2,3};
}
std::vector<int> v()
{
return std::vector<int>{1,2,3};
}
int main()
{
for(auto i : l()){
std::cout << i << endl;
}
for(auto i : v()){
std::cout << i << endl;
}
}
0
0
0
1
2
3
なんで?
459デフォルトの名無しさん
2019/03/18(月) 22:56:40.87ID:bBcTS09+460デフォルトの名無しさん
2019/03/18(月) 23:23:21.73ID:qPN/SC1k461デフォルトの名無しさん
2019/03/18(月) 23:28:12.28ID:c3AGzLzz qsort「おっワイの出番か?」
462デフォルトの名無しさん
2019/03/19(火) 00:00:01.33ID:V3eHYYxi cのsortってラムダ渡せないし、ワザワザ面倒くさい記述してまで使う意味無いだろう。
463デフォルトの名無しさん
2019/03/19(火) 00:37:48.08ID:wfF3ncvB template<typename T>
T func(T a){
}
という関数の中身として、T が int なら a*2 を返し、T が double ならa/2 を返し、それ以外なら a を返す、という処理にしたい場合どう書いたら良いのでしょうか。
関数ごと特殊化する方法があるのは勉強したのですが、一行分の処理を特殊化するために関数ごと特殊化するべきなのでしょうか。
簡単化のため、必要さが全くない例になっていますがよろしくお願いします。
T func(T a){
}
という関数の中身として、T が int なら a*2 を返し、T が double ならa/2 を返し、それ以外なら a を返す、という処理にしたい場合どう書いたら良いのでしょうか。
関数ごと特殊化する方法があるのは勉強したのですが、一行分の処理を特殊化するために関数ごと特殊化するべきなのでしょうか。
簡単化のため、必要さが全くない例になっていますがよろしくお願いします。
464デフォルトの名無しさん
2019/03/19(火) 00:43:22.56ID:fW/dBWxG STLが天才なのは分かったけど、遅くなりそうなのも分かってしまった。
465デフォルトの名無しさん
2019/03/19(火) 00:49:23.69ID:fW/dBWxG466デフォルトの名無しさん
2019/03/19(火) 00:54:54.54ID:V3eHYYxi >>463
簡単化しすぎて何を質問したいのかよくわからない
その例の程度の処理なら、intとdoubleの関数をオーバーロードして、template関数でデフォルトの処理も書けばいい
intとdoubleをどうしてもtemplate化したかったら特殊化で書けばいい
前後に長い共通処理がある場合の一部式だけ個別にしたいなら、関数オブジェクトで式を引数にとる補助template関数作って、上記手法で型毎にlambdaで式を変えて補助関数を呼び分ければいい
簡単化しすぎて何を質問したいのかよくわからない
その例の程度の処理なら、intとdoubleの関数をオーバーロードして、template関数でデフォルトの処理も書けばいい
intとdoubleをどうしてもtemplate化したかったら特殊化で書けばいい
前後に長い共通処理がある場合の一部式だけ個別にしたいなら、関数オブジェクトで式を引数にとる補助template関数作って、上記手法で型毎にlambdaで式を変えて補助関数を呼び分ければいい
467デフォルトの名無しさん
2019/03/19(火) 00:56:32.83ID:wfF3ncvB >>466
特殊化する部分を関数として切り出して特殊化すれば良いということでしょうか。
特殊化する部分を関数として切り出して特殊化すれば良いということでしょうか。
468デフォルトの名無しさん
2019/03/19(火) 06:48:59.95ID:smCJKSpo >>450
まずは、エラーなくコンパイルが通って実行できるまで。
単純には、比較関数をクラスの外に出して「メンバ関数じゃない関数」にする。
たぶんソートしたいクラス中には比較する文字列以外のメンバもあるだろうから、
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
};
こんな感じだと思う。
比較関数は、2つの myclass 型のオブジェクトのメンバ s 同士を比較するから、
bool mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
まずは、エラーなくコンパイルが通って実行できるまで。
単純には、比較関数をクラスの外に出して「メンバ関数じゃない関数」にする。
たぶんソートしたいクラス中には比較する文字列以外のメンバもあるだろうから、
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
};
こんな感じだと思う。
比較関数は、2つの myclass 型のオブジェクトのメンバ s 同士を比較するから、
bool mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
469468
2019/03/19(火) 06:54:39.65ID:smCJKSpo あるいは >>468 の段階はすでに通過してて、
「今度は比較関数をクラスのメンバ関数にしてみよう」と思ったのかな。
bool mycomp(string a, string b);
このプロトタイプでクラスの「staticでないメンバ関数」にすると、
その関数はクラスのオブジェクトを介して obj.mycomp((string)a, (string)b)
という形で呼び出さなきゃならないのよ。
ところが std::sort() が比較関数を呼び出す場合は
どのオブジェクトとも関係ない mycomp((string)a, (string)b) を呼ぼうとする。
「クラスのメンバだけど、クラスの個々のオブジェクトからは独立した関数」に
するために、関数の宣言に static を指定する。
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
static bool mycomp(const myclass& a, const myclass& b); // 比較関数
};
(「改行多すぎ」につき、もう一回だけつづく)
「今度は比較関数をクラスのメンバ関数にしてみよう」と思ったのかな。
bool mycomp(string a, string b);
このプロトタイプでクラスの「staticでないメンバ関数」にすると、
その関数はクラスのオブジェクトを介して obj.mycomp((string)a, (string)b)
という形で呼び出さなきゃならないのよ。
ところが std::sort() が比較関数を呼び出す場合は
どのオブジェクトとも関係ない mycomp((string)a, (string)b) を呼ぼうとする。
「クラスのメンバだけど、クラスの個々のオブジェクトからは独立した関数」に
するために、関数の宣言に static を指定する。
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
static bool mycomp(const myclass& a, const myclass& b); // 比較関数
};
(「改行多すぎ」につき、もう一回だけつづく)
470468
2019/03/19(火) 06:57:01.64ID:smCJKSpo (>>469 の続き、長々とすまぬ)
関数の定義(クラス定義の外に書く場合)はこんな感じ。
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
myclass のメンバ関数だと明示するために myclass:: をつけることと、
定義の方には static をつけない、てところが注意点。
std::sort() で使う時は、
std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
…する必要が(俺の環境では)あるんだけど、myclass 同士を比較することから、
自動的に myclass のメンバ関数も候補に入れてくれても良さそうな気がする。
なんでダメなんだろ?
関数の定義(クラス定義の外に書く場合)はこんな感じ。
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
myclass のメンバ関数だと明示するために myclass:: をつけることと、
定義の方には static をつけない、てところが注意点。
std::sort() で使う時は、
std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
…する必要が(俺の環境では)あるんだけど、myclass 同士を比較することから、
自動的に myclass のメンバ関数も候補に入れてくれても良さそうな気がする。
なんでダメなんだろ?
471デフォルトの名無しさん
2019/03/19(火) 07:25:56.87ID:aaAbvqyx たかがソート一つ実行するのにこれってやっぱc++は失敗しとるわ。。
472デフォルトの名無しさん
2019/03/19(火) 07:30:30.93ID:/K8ycOQq どの言語も似たようなもんだろ
473デフォルトの名無しさん
2019/03/19(火) 07:31:18.45ID:K4E5ztRO >>468-470
丁寧に教えてくださりありがとうございます。
今のところは、>>468に書かれているようにクラスの外に出す、という方針で対応しておりました。
クラスの中で static をつけて宣言をする、というのが元々やりたかったことに一番近いように思います。重ね重ねありがとうございます。
>>470
> std::sort() で使う時は、
> std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
> 「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
これは、mycomp() をクラス内で非static に宣言したときにも使えますか。
それとも、クラスの外で
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
流に宣言、定義した場合に限りますか。
丁寧に教えてくださりありがとうございます。
今のところは、>>468に書かれているようにクラスの外に出す、という方針で対応しておりました。
クラスの中で static をつけて宣言をする、というのが元々やりたかったことに一番近いように思います。重ね重ねありがとうございます。
>>470
> std::sort() で使う時は、
> std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
> 「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
これは、mycomp() をクラス内で非static に宣言したときにも使えますか。
それとも、クラスの外で
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
流に宣言、定義した場合に限りますか。
474デフォルトの名無しさん
2019/03/19(火) 07:33:59.57ID:LjcR+vA2 何のために非staticにこだわるんだ?
メンバにアクセスしないならstaticつけとけよ
メンバにアクセスしないならstaticつけとけよ
475デフォルトの名無しさん
2019/03/19(火) 08:36:28.37ID:I3ez8Qch 比較関数をメンバ関数としてクラスに内在させるのが良くない
外部化するか、演算子オーバーロードする
どちらかと言うと比較関数を作らずに大小関係を定義する言語だ
実は、関数やクラスの間の包含関係がある
クラスを比較する関数はクラスの外部におかれるべきであって、メンバ関数にするのは筋が悪い
クラス内部に置くなら大小関係の定義にすべきだ
この手の階層関係は、規格書にもどんな教科書にも一切書かれてないけど、暗黙のうちに了解されている
外部化するか、演算子オーバーロードする
どちらかと言うと比較関数を作らずに大小関係を定義する言語だ
実は、関数やクラスの間の包含関係がある
クラスを比較する関数はクラスの外部におかれるべきであって、メンバ関数にするのは筋が悪い
クラス内部に置くなら大小関係の定義にすべきだ
この手の階層関係は、規格書にもどんな教科書にも一切書かれてないけど、暗黙のうちに了解されている
476デフォルトの名無しさん
2019/03/19(火) 09:31:11.81ID:wYd+ZeEZ 対称な演算子をインスタンスメンバにするのはセンス無いね
477デフォルトの名無しさん
2019/03/19(火) 15:31:26.82ID:Pb8DX7io >>463
template <typename T>
T func(T a) {
if constexpr (std::is_same_v<T, int>) return a * 2;
else if constexpr (std::is_same_v<T, double>) return a / 2;
else return a;
}
template <typename T>
T func(T a) {
if constexpr (std::is_same_v<T, int>) return a * 2;
else if constexpr (std::is_same_v<T, double>) return a / 2;
else return a;
}
478デフォルトの名無しさん
2019/03/19(火) 16:57:51.01ID:W9RsgnS5 namespaceを活用しろ
479デフォルトの名無しさん
2019/03/19(火) 17:11:35.93ID:HTVBHQBE >>477
これの方が関数として切り出して特殊化するより好きな見た目です
これの方が関数として切り出して特殊化するより好きな見た目です
480デフォルトの名無しさん
2019/03/19(火) 21:29:30.46ID:bWZzZfFH >>477
それだと実行時に判断コストがかかるじゃん
それだと実行時に判断コストがかかるじゃん
481デフォルトの名無しさん
2019/03/19(火) 21:29:55.51ID:QA3viZTS if constexprってtypeidで情報取ってきて比較するみたいなオーバーヘッドが0になりますか?
482デフォルトの名無しさん
2019/03/19(火) 21:33:24.72ID:Nfgw9yWF おじさん久々にC++の仕事受けたんだけど
色々進化してて面食らってます
今、右辺値参照っての勉強中なんだけど
ムーブコンストラクタとかはへーへーほーほー言いながら何となく分かり始めた
んだけどさ、
int &&x = 2; // ok <-これだけ使い途が分からん
ローカル変数の右辺値参照て何に使うん?
実験してみた限り、勝手にムーブとかしてくれるわけでもなさそうだし
ローカル変数に&&付いてると何に使えてんな時便利なの?
色々進化してて面食らってます
今、右辺値参照っての勉強中なんだけど
ムーブコンストラクタとかはへーへーほーほー言いながら何となく分かり始めた
んだけどさ、
int &&x = 2; // ok <-これだけ使い途が分からん
ローカル変数の右辺値参照て何に使うん?
実験してみた限り、勝手にムーブとかしてくれるわけでもなさそうだし
ローカル変数に&&付いてると何に使えてんな時便利なの?
483デフォルトの名無しさん
2019/03/19(火) 21:34:25.38ID:/K8ycOQq 使わなくていい
484デフォルトの名無しさん
2019/03/19(火) 21:40:02.75ID:kyorfls3485デフォルトの名無しさん
2019/03/19(火) 22:04:14.68ID:gYGT/BxR 変数宣言した右辺値参照そのものは左辺値という罠
極力そんな物作るべきじゃないね
極力そんな物作るべきじゃないね
486デフォルトの名無しさん
2019/03/19(火) 22:05:37.07ID:8COf7JeC 俺今使い道思いついたんだけど披露してもいい?
>>486
どうぞどうぞ…
どうぞどうぞ…
488デフォルトの名無しさん
2019/03/19(火) 22:37:18.08ID:xP6m0cDT >>480-481
if constexprは実行時コストゼロのはずだよ
if constexprは実行時コストゼロのはずだよ
489デフォルトの名無しさん
2019/03/19(火) 22:53:01.58ID:bWZzZfFH >>488
ifがなんで実行時ゼロなんだよ
ifがなんで実行時ゼロなんだよ
490デフォルトの名無しさん
2019/03/19(火) 23:23:47.41ID:hIuEq8sX 赤っ恥
491デフォルトの名無しさん
2019/03/19(火) 23:26:12.29ID:/K8ycOQq >>489
if constexprにするとコンパイル時に評価されて特定の分岐のみが実体化される
if constexprにするとコンパイル時に評価されて特定の分岐のみが実体化される
492デフォルトの名無しさん
2019/03/19(火) 23:38:47.81ID:zcFktSXp493デフォルトの名無しさん
2019/03/20(水) 00:20:58.62ID:wnXzlprR494デフォルトの名無しさん
2019/03/20(水) 00:27:33.64ID:K21QzJf5 初心者がやたらとアスタリスク使ってポインタの参照値を得ようとするのに似た感じがある。
他言語に移植しにくいだろ、テンプレート化しにくくなるだろ、と小一時間。
他言語に移植しにくいだろ、テンプレート化しにくくなるだろ、と小一時間。
495デフォルトの名無しさん
2019/03/20(水) 00:56:45.75ID:LskeNtBJ アスタリスク使ってポインタの中身取ったらあかんのか・・・
496デフォルトの名無しさん
2019/03/20(水) 03:19:15.41ID:abqqrm1b multimap よりも set の vector の方が便利なのですが、異端ですか?
497デフォルトの名無しさん
2019/03/20(水) 04:26:37.96ID:LuG6mmni 別に
498はちみつ餃子 ◆8X2XSCHEME
2019/03/20(水) 04:53:08.98ID:K9L8gFp5 >>482
既に回答がついているとおり、 rvalue 参照はほとんどムーブのための機能。
ローカル変数的に使う理由はあんまりない。
テンプレート関数の仮引数や auto 変数として rvalue 参照 (の記法) が現れたときは
特殊な推論規則 (ユニバーサル参照) が適用されるというのは気を付ける必要がある。
既に回答がついているとおり、 rvalue 参照はほとんどムーブのための機能。
ローカル変数的に使う理由はあんまりない。
テンプレート関数の仮引数や auto 変数として rvalue 参照 (の記法) が現れたときは
特殊な推論規則 (ユニバーサル参照) が適用されるというのは気を付ける必要がある。
499デフォルトの名無しさん
2019/03/20(水) 07:25:39.73ID:iA5XXTHz ローカル変数もそうだけどintみたいなオブジェクト性が低いものに使っても意味ないわな。
rustの古いチュートリアルのmoveの例がなぜかintでクソだったけれど最近は文字列型になっとった。
rustの古いチュートリアルのmoveの例がなぜかintでクソだったけれど最近は文字列型になっとった。
500デフォルトの名無しさん
2019/03/20(水) 08:44:38.76ID:LSg3zFHe オブジェクト性
501デフォルトの名無しさん
2019/03/20(水) 10:22:31.87ID:fk3FMvWg 考えうるメソッドが少ない=オブジェクト性が低い、とかじゃねえの
int型の変数.length() とかは流石に意味不明に見える
int型の変数.length() とかは流石に意味不明に見える
502デフォルトの名無しさん
2019/03/20(水) 10:40:09.36ID:LuG6mmni 言いたいことは分かるが聞き慣れない言葉を使っているということでは
503デフォルトの名無しさん
2019/03/20(水) 11:01:00.31ID:9pRMZ9XY リテラルが右辺値ってのがよくわからんのだが
上の例のように右辺値参照でうけるとリテラルなのにそのアドレスがとれてしまう
かつ書き換え可能
なので右辺値参照にリテラルいれるときは、一旦名前のない領域にコピーされていると理解している
でもこれって通常の値の代入のときも名前のない領域にコピーしてからさらにコピーというセマンティクスなの?
上の例のように右辺値参照でうけるとリテラルなのにそのアドレスがとれてしまう
かつ書き換え可能
なので右辺値参照にリテラルいれるときは、一旦名前のない領域にコピーされていると理解している
でもこれって通常の値の代入のときも名前のない領域にコピーしてからさらにコピーというセマンティクスなの?
504デフォルトの名無しさん
2019/03/20(水) 11:29:19.49ID:sS5iHBwg 右辺値参照変数それ自体は左辺値だからね
505デフォルトの名無しさん
2019/03/20(水) 15:37:27.50ID:oYbI5+uJ 右辺値を参照で束縛すると、その右辺値の寿命は束縛してる参照と同じところまで引き伸ばされる
この点は左辺値参照も右辺値参照も一緒
この点は左辺値参照も右辺値参照も一緒
506デフォルトの名無しさん
2019/03/20(水) 16:05:23.24ID:9pRMZ9XY それ >>503 に関係ある?
507デフォルトの名無しさん
2019/03/20(水) 16:16:24.82ID:oYbI5+uJ どうして関係ないと思うの?
508デフォルトの名無しさん
2019/03/20(水) 20:55:29.39ID:9pRMZ9XY 一見リテラルのアドレスが取れて書き換えられる、ように見えることに疑問を持ってる
言い方変えると
右辺値参照に代入するとき
リテラルが右辺値でなくて、そのコピーが右辺値なのでは?
そこに寿命がどう関係あるのかわからない
言い方変えると
右辺値参照に代入するとき
リテラルが右辺値でなくて、そのコピーが右辺値なのでは?
そこに寿命がどう関係あるのかわからない
509デフォルトの名無しさん
2019/03/20(水) 21:07:28.64ID:LskeNtBJ アセンブラレベルで言うなら、即値なのかdataセクションにあるのかの違いじゃないの
510デフォルトの名無しさん
2019/03/20(水) 21:31:53.81ID:iA5XXTHz >オブジェクト性
コピーでも参照でも対してコストがかからんものというかそういうニュアンスなんだが
思った以上に伝わらんもんだな。
わかりやすいようにintと文字列を例に出してもこんなもんかもね。
コピーでも参照でも対してコストがかからんものというかそういうニュアンスなんだが
思った以上に伝わらんもんだな。
わかりやすいようにintと文字列を例に出してもこんなもんかもね。
511デフォルトの名無しさん
2019/03/20(水) 22:56:30.82ID:B8C8ZXR4 アドレスが取れたら右辺値ではないみたいな論調だな
512デフォルトの名無しさん
2019/03/20(水) 23:15:02.74ID:oYbI5+uJ >>508
C++のリテラルというのは右辺値を生成する式なんだよ
「42」は値42を持つint型の右辺値を生成することを指示するリテラル
「"hello"」は中身が'h','e','l','l','o','\0'なchar[6]への参照を生成することを指示するリテラル
プログラムが実行時に扱うのは「リテラル」じゃなくてリテラルが生成した右辺値だ
その生成された右辺値は当然メモリ上にあっていいし書き換えられてもいい
(その必要がないならコンパイラがそうじゃないように最適化してももちろんいい)
「コピー」だと思うから違和感があるんじゃない?
リテラルなるものの実体が空の上やPCの隙間に隠れてるわけじゃないし、プログラムはそんなものは取り扱えない
C++のリテラルというのは右辺値を生成する式なんだよ
「42」は値42を持つint型の右辺値を生成することを指示するリテラル
「"hello"」は中身が'h','e','l','l','o','\0'なchar[6]への参照を生成することを指示するリテラル
プログラムが実行時に扱うのは「リテラル」じゃなくてリテラルが生成した右辺値だ
その生成された右辺値は当然メモリ上にあっていいし書き換えられてもいい
(その必要がないならコンパイラがそうじゃないように最適化してももちろんいい)
「コピー」だと思うから違和感があるんじゃない?
リテラルなるものの実体が空の上やPCの隙間に隠れてるわけじゃないし、プログラムはそんなものは取り扱えない
513デフォルトの名無しさん
2019/03/21(木) 00:07:41.99ID:2SUbybof514デフォルトの名無しさん
2019/03/21(木) 00:13:13.37ID:2SUbybof515デフォルトの名無しさん
2019/03/21(木) 00:14:13.96ID:FPuzf0hs 牛からは牛乳が出るけど牛は牛乳じゃないだろ?
そういうこと
そういうこと
516デフォルトの名無しさん
2019/03/21(木) 00:20:16.95ID:FPuzf0hs リテラルってのは文法要素なの
演算子とかキーワードとかコメントとかそういうものの仲間なの
実行時にはそんなものは出てこない
プログラムが扱えるのは「値」だけで、左辺値とか右辺値というのはその分類
int型の0x2Aという値を生成しろという命令をコンパイラに作ってもらうためにプログラマが書くものが「42」というリテラル
さっきからずっとそこを混同してる
演算子とかキーワードとかコメントとかそういうものの仲間なの
実行時にはそんなものは出てこない
プログラムが扱えるのは「値」だけで、左辺値とか右辺値というのはその分類
int型の0x2Aという値を生成しろという命令をコンパイラに作ってもらうためにプログラマが書くものが「42」というリテラル
さっきからずっとそこを混同してる
517デフォルトの名無しさん
2019/03/21(木) 01:01:57.88ID:7qm1Whlz '\0' と L'\0' で違うしな
518デフォルトの名無しさん
2019/03/21(木) 02:01:40.67ID:/XDYuiDC >>503,514
数値リテラルは右辺値。
https://timsong-cpp.github.io/cppwp/n4659/expr.prim.literal#1
右辺値で参照を初期化する際は一時オブジェクト(=名前のない領域)が生成され、
それが参照されるというルールになってる。
https://timsong-cpp.github.io/cppwp/n4659/dcl.init.ref#5.2
参照を初期化する際のルールは代入のセマンティクスとは関係ない。
int i; i = 42 の代入で一時オブジェクトは不要。
代入がユーザー定義された T::operator=(T const&) に解決されるなら、
引数の参照を初期化する際に一時オブジェクトが作られることはある。
数値リテラルは右辺値。
https://timsong-cpp.github.io/cppwp/n4659/expr.prim.literal#1
右辺値で参照を初期化する際は一時オブジェクト(=名前のない領域)が生成され、
それが参照されるというルールになってる。
https://timsong-cpp.github.io/cppwp/n4659/dcl.init.ref#5.2
参照を初期化する際のルールは代入のセマンティクスとは関係ない。
int i; i = 42 の代入で一時オブジェクトは不要。
代入がユーザー定義された T::operator=(T const&) に解決されるなら、
引数の参照を初期化する際に一時オブジェクトが作られることはある。
519デフォルトの名無しさん
2019/03/21(木) 02:39:44.49ID:XdhJMiFj 即値になる場合があるから右辺値なのかね。
520デフォルトの名無しさん
2019/03/21(木) 08:57:30.01ID:YzD9JPpd そりゃ、代入の左辺にリテラルを置ける言語なんてまずないから。
521デフォルトの名無しさん
2019/03/21(木) 09:47:23.84ID:MFgTD1Yv コピーのコストを抑えつつ、二重に参照されないように元のオブジェクトを指す変数を無効にしたいってのが
moveに期待される機能。
即値だったり呼び出しの引数にコンストラクタごと放り込まれた場合には
上記のような二重に参照されるようなシチュエーションにはならんのでmove受けする関数が定義されてれば
その関数を呼びましょうってのがc++のmoveの取り扱い。
しかしこんなにもシンタックスが複雑で機能性も新しくてオーバーロードでさらに複雑になってるってのは
やっぱよくないと思うわ。
テンプレートの都合でオーバーロードが必要なのもわかるが明らかにやりすぎ。
moveに期待される機能。
即値だったり呼び出しの引数にコンストラクタごと放り込まれた場合には
上記のような二重に参照されるようなシチュエーションにはならんのでmove受けする関数が定義されてれば
その関数を呼びましょうってのがc++のmoveの取り扱い。
しかしこんなにもシンタックスが複雑で機能性も新しくてオーバーロードでさらに複雑になってるってのは
やっぱよくないと思うわ。
テンプレートの都合でオーバーロードが必要なのもわかるが明らかにやりすぎ。
522デフォルトの名無しさん
2019/03/21(木) 23:38:07.17ID:/AmzWt7k 会社にもいるわ、そんなどうでもいいことをウンチクばっか垂れて一向に仕事が終わらないやつw
言語を設計するなら、必要かもしれんが大抵は不要
言語を設計するなら、必要かもしれんが大抵は不要
523デフォルトの名無しさん
2019/03/21(木) 23:48:46.46ID:4AnWSc+d 「だからC++スゲー俺スゲー」ってやつじゃないの?それ
>>521がそうだとは思えんが
>>521がそうだとは思えんが
524デフォルトの名無しさん
2019/03/21(木) 23:52:29.07ID:MDPJmZ4F 最近は彼らもRustにマウント奪われて必死なんだよ
525はちみつ餃子 ◆8X2XSCHEME
2019/03/21(木) 23:53:05.57ID:uQDXDHVg 理屈がわかってないのに仕事が終わってるのもそれはそれで不気味じゃない?
526デフォルトの名無しさん
2019/03/21(木) 23:56:55.88ID:MDPJmZ4F >>525
moveなんか理解してなくてもだいたいのC++の現場では仕事に支障ないよ
moveなんか理解してなくてもだいたいのC++の現場では仕事に支障ないよ
527デフォルトの名無しさん
2019/03/21(木) 23:58:36.31ID:tdnDQnUt528デフォルトの名無しさん
2019/03/21(木) 23:59:59.31ID:MDPJmZ4F >>527
君はC++の30年の歴史を否定するのかい?
君はC++の30年の歴史を否定するのかい?
529デフォルトの名無しさん
2019/03/22(金) 00:10:18.90ID:cT8zbTae templateも使うことは、OKだがtemplateを用いたクラスを作ることは禁止されている場合がおおい
そもそも、設計段階で型が決定しないなんてことは、汎用ライブラリを書く以外はないだろ
そもそも、設計段階で型が決定しないなんてことは、汎用ライブラリを書く以外はないだろ
530デフォルトの名無しさん
2019/03/22(金) 00:22:46.08ID:aMVb4R4+ いやいや
決まっていてもそれが複数だった場合使うだろ
あと普通にライブラリは作るものじゃ
決まっていてもそれが複数だった場合使うだろ
あと普通にライブラリは作るものじゃ
531デフォルトの名無しさん
2019/03/22(金) 00:54:33.33ID:wBHxe+dJ ていうか、普通に仕事をしていたら「ああここは処理共通だからまとめて・・
・・あとここをこうしとけば拡張にも対応できるし・・まあ客が無茶振りして
きたときの予防にそれなりに汎用性もたせとくか」とかやっているうちに
いつのまにかライブラリができあがってる、これがプロの仕事だ
・・あとここをこうしとけば拡張にも対応できるし・・まあ客が無茶振りして
きたときの予防にそれなりに汎用性もたせとくか」とかやっているうちに
いつのまにかライブラリができあがってる、これがプロの仕事だ
532デフォルトの名無しさん
2019/03/22(金) 00:55:35.30ID:wNvbYX88 委託業務メインなの?
533デフォルトの名無しさん
2019/03/22(金) 01:10:14.13ID:LxKdyD8r 定数って参照透過性があるよね。
C++はconstexprがあるのだから、関数型プログラミングを超える、定数型プログラミングという新パラダイムを提唱したいと思います。
C++はconstexprがあるのだから、関数型プログラミングを超える、定数型プログラミングという新パラダイムを提唱したいと思います。
534はちみつ餃子 ◆8X2XSCHEME
2019/03/22(金) 01:14:02.50ID:6voZlles コンパイル時レイトレーシングとかやってる人もいるけど狂気の産物って感じがして C++ ぽくて良い。
535デフォルトの名無しさん
2019/03/22(金) 02:28:04.74ID:jw/5aFNH しーぷら一筋30年〜、速いの、上手いの、やっすいの〜
536デフォルトの名無しさん
2019/03/22(金) 02:37:28.24ID:M4ChOHMa >>534
>コンパイル時レイトレーシング
一応訊くけど、ああいうのはレイ当てる3Dオブジェクトのデータは
全てC++のソースに書かないといけないことは分かってる?(モデリングデータをファイルから読んでコンパイル時にレイトレするのは当然不可能)
あの試み自体は面白いと思うけどね・・
実用性や(ソフトウェアの)ユーザーの利益にならないことをもてはやさないで欲しいもんだが
>コンパイル時レイトレーシング
一応訊くけど、ああいうのはレイ当てる3Dオブジェクトのデータは
全てC++のソースに書かないといけないことは分かってる?(モデリングデータをファイルから読んでコンパイル時にレイトレするのは当然不可能)
あの試み自体は面白いと思うけどね・・
実用性や(ソフトウェアの)ユーザーの利益にならないことをもてはやさないで欲しいもんだが
537デフォルトの名無しさん
2019/03/22(金) 06:24:27.94ID:j45II+ff プリレンダのゲームは大量にあるしレイトレーシングしとくのもその延長線上じゃない
538デフォルトの名無しさん
2019/03/22(金) 08:03:01.00ID:VPBgCitj コンパイル時ファイル入出力がサポートされればいいわけだ
それにレイトレーシングはまあ確かに冗談も含まれてるだろうけどそれだけ複雑で重い処理でも可能だという技術デモは価値があるだろう
画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか色々できて可能性はあると思うよ
それにレイトレーシングはまあ確かに冗談も含まれてるだろうけどそれだけ複雑で重い処理でも可能だという技術デモは価値があるだろう
画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか色々できて可能性はあると思うよ
539デフォルトの名無しさん
2019/03/22(金) 08:17:25.29ID:sSVPAm0I 汎用的につかってもらうことを目的としているライブラリを除けば
コーディング時に型が決まっていないことなんてありえない
もしあるならそれは設計してないってことじゃん
templateなんて汎用的につかってもらうことを目的としているライブラリを書く場合にしか使わないだろ
後で、intからdoubleになるかもしれないから、なんて言ってるバカいるけど
きっちり設計しろよ
コーディング時に型が決まっていないことなんてありえない
もしあるならそれは設計してないってことじゃん
templateなんて汎用的につかってもらうことを目的としているライブラリを書く場合にしか使わないだろ
後で、intからdoubleになるかもしれないから、なんて言ってるバカいるけど
きっちり設計しろよ
540デフォルトの名無しさん
2019/03/22(金) 08:28:45.64ID:wNvbYX88541デフォルトの名無しさん
2019/03/22(金) 09:08:34.94ID:OAKB0NCU542デフォルトの名無しさん
2019/03/22(金) 09:11:15.22ID:VPBgCitj >>541
俺は好きになったよ
俺は好きになったよ
543デフォルトの名無しさん
2019/03/22(金) 09:31:33.91ID:OAKB0NCU いいね、趣味で気楽に使ってる人は
544デフォルトの名無しさん
2019/03/22(金) 09:52:12.19ID:VPBgCitj ええやろ
楽しいわ
楽しいわ
545デフォルトの名無しさん
2019/03/22(金) 10:20:45.52ID:RSNtol3b メタプログラミングってコンパイル時に評価してゼロオーバーヘッドとかすごいとは思うけど
学習コストや可読性と釣り合ってるか?
学習コストや可読性と釣り合ってるか?
546デフォルトの名無しさん
2019/03/22(金) 10:32:59.03ID:OAKB0NCU 仕事で4月になったらまた新しいメンバーシップ増えるけど
なまじ趣味でc++使ってたやつが一番困る
新しい機能使いたいだけでトータルの生産性考えないんだよね
なまじ趣味でc++使ってたやつが一番困る
新しい機能使いたいだけでトータルの生産性考えないんだよね
547デフォルトの名無しさん
2019/03/22(金) 10:41:23.85ID:wNvbYX88 そんな一部の現場の実情を忖度してたら競争に負けてしまうのではないか?
548デフォルトの名無しさん
2019/03/22(金) 10:45:43.23ID:VPBgCitj 毎回同じこといってる奴いるよな
このスレには10人くらいしか居ないってネタは挙がってるし
このスレには10人くらいしか居ないってネタは挙がってるし
549デフォルトの名無しさん
2019/03/22(金) 11:07:13.15ID:v3KGlGVP550デフォルトの名無しさん
2019/03/22(金) 11:11:55.43ID:nPC1T1eJ >>545
やってることの性質にもよる
サーバーサイドなんかで潤沢なリソースを使って長時間動くものだとほとんど意味はないよ
その場合.NETやJavaのような実行時コード生成の方が遥かに柔軟性が高く、オーバーヘッドも実質的にはほとんどない
やってることの性質にもよる
サーバーサイドなんかで潤沢なリソースを使って長時間動くものだとほとんど意味はないよ
その場合.NETやJavaのような実行時コード生成の方が遥かに柔軟性が高く、オーバーヘッドも実質的にはほとんどない
551はちみつ餃子 ◆8X2XSCHEME
2019/03/22(金) 12:34:15.37ID:6voZlles >>536
それ自体はただの余興だけど、
コンパイラのバグを顕在化させる成果を出したりもしてるよ。
処理系の開発チームにとってもまずは問題を発見できなきゃ直せないからさ、
色んな形で使ってみる人だってそれはそれで必要なんだよ。
処理系の質が良くなるのは間接的にユーザの利益にだってなる。
それ自体はただの余興だけど、
コンパイラのバグを顕在化させる成果を出したりもしてるよ。
処理系の開発チームにとってもまずは問題を発見できなきゃ直せないからさ、
色んな形で使ってみる人だってそれはそれで必要なんだよ。
処理系の質が良くなるのは間接的にユーザの利益にだってなる。
553デフォルトの名無しさん
2019/03/22(金) 14:12:54.65ID:M4ChOHMa >>551
まぁその理屈はわからんでもないしメタプログラミングやってるとあの人のブログは勉強になるけどね
ただああいうのはブラックジョークの類であることを忘れると>>537みたいな勘違いした奴が出てくる
>>538
>画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか
それ、画像もコンパイル時に確定してるデータじゃないとあかんのやで?
(しかもconstexprなcharの配列みたいな、C++のコードに直さないといけない)
重ねて言うけど、面白い試みだけど実用的ではないんだよ、ああいうのをC++的だとかカッコいいとかもてはやすのはC++の衰退を招くだけ
趣味グラマは自分が趣味グラマであって時に実用性からかけ離れてるということを自覚すべき
まぁその理屈はわからんでもないしメタプログラミングやってるとあの人のブログは勉強になるけどね
ただああいうのはブラックジョークの類であることを忘れると>>537みたいな勘違いした奴が出てくる
>>538
>画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか
それ、画像もコンパイル時に確定してるデータじゃないとあかんのやで?
(しかもconstexprなcharの配列みたいな、C++のコードに直さないといけない)
重ねて言うけど、面白い試みだけど実用的ではないんだよ、ああいうのをC++的だとかカッコいいとかもてはやすのはC++の衰退を招くだけ
趣味グラマは自分が趣味グラマであって時に実用性からかけ離れてるということを自覚すべき
554デフォルトの名無しさん
2019/03/22(金) 14:23:16.46ID:M4ChOHMa あ、でも
>>538
>コンパイル時ファイル入出力
これはやり過ぎな気もするけど個人的にはあっても良いとは思うw
ただ、画像のフィルタリングをコンパイル時にやるのとツール作って実行時にやるのとで
前者が便利な場面ってあるのかね?(しかも前者は非常に開発コストかかる
>>538
>コンパイル時ファイル入出力
これはやり過ぎな気もするけど個人的にはあっても良いとは思うw
ただ、画像のフィルタリングをコンパイル時にやるのとツール作って実行時にやるのとで
前者が便利な場面ってあるのかね?(しかも前者は非常に開発コストかかる
555デフォルトの名無しさん
2019/03/22(金) 14:28:03.34ID:VPBgCitj >>553
コンパイル時に確定しているデータがあるかもしれないし無いかもしれない
fstreamがコンパイル時に動くようになればいいだけ
そうなれば準備が面倒なプリプロセスも必要ない
研究に対して実用性がうんたらとかわけ分からないことを言うのはよくないなあ
様々なアイデアから自分の都合のいいところをつまんで実用化するのが末端の仕事だろうに
俺が使い道が思いつかないことに熱心になってると界隈が衰退するとかさすがに草生える
コンパイル時に確定しているデータがあるかもしれないし無いかもしれない
fstreamがコンパイル時に動くようになればいいだけ
そうなれば準備が面倒なプリプロセスも必要ない
研究に対して実用性がうんたらとかわけ分からないことを言うのはよくないなあ
様々なアイデアから自分の都合のいいところをつまんで実用化するのが末端の仕事だろうに
俺が使い道が思いつかないことに熱心になってると界隈が衰退するとかさすがに草生える
556デフォルトの名無しさん
2019/03/22(金) 14:29:27.80ID:OAKB0NCU 静的なものはなんでもコンパイル時に解決するって思想が典型的なハンマー釘病なんだよ
コンパイル時だけが解じゃない
そのうち仕事で特に理由なくむやみに重いconstexprぶちこむやつがでてくるだろう
それでビルド時間5分10分長くなったりするわけだ
ほんとc++はクソ
コンパイル時だけが解じゃない
そのうち仕事で特に理由なくむやみに重いconstexprぶちこむやつがでてくるだろう
それでビルド時間5分10分長くなったりするわけだ
ほんとc++はクソ
557デフォルトの名無しさん
2019/03/22(金) 14:32:15.97ID:VPBgCitj■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【前橋市】小川晶前市長とラブホテルで打ち合わせをした54歳男性職員を停職処分 今月末で依願退職するという [シャチ★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★2 [ぐれ★]
- 【埼玉】「無免許で高速道路で事故」トラックの追突事故で10代男性死亡 無免許過失運転致死の疑いでトルコ国籍の男(22)逮捕 戸田市 [ぐれ★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★6 [七波羅探題★]
- 広島・廿日市、おこめ券配布せず 全市民に3000円現金給付へ [どどん★]
- 【警視庁】走行中の電車で女性に露出した下半身押しつけたか 無職の男(46)逮捕「チャンスがあればいつでもやる」 [nita★]
- 【実況】博衣こよりのえちえちチーズケーキを仕込み(雑談あり)🧪★2
- 石破「日中関係は最新の注意払うべき」ヤフコメ大激怒してしまう [163661708]
- じゃあ何券だったら、日本人は満足したんだよ [452836546]
- 朝日新聞記者「中国軍のレーダー照射はこめかみに銃を突きつけられたのと同じ。僕なら反撃して撃墜してる」高市 [931948549]
- 維新議員、キャバクラマネー返金へ→「今回は返金する」「ポケットマネーでやるには限界がある」 [834922174]
- 【速報】1ポンド210円で日英GDP逆転(残り1.5円)...世界6位の経済規模に転落 [237216734]
