次スレを立てる時は本文の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
439デフォルトの名無しさん
2019/03/17(日) 22:25:37.54ID:NYZE0cFr 多分7に入ってた電卓とは別物だな
440デフォルトの名無しさん
2019/03/17(日) 23:22:31.89ID:0FN5yhQH441デフォルトの名無しさん
2019/03/18(月) 00:13:57.67ID:HNvbYtsL Windowsカーネルのオープンソース化待ってます
442デフォルトの名無しさん
2019/03/18(月) 05:32:24.67ID:+E07qlDR sort関数の比較関数を、クラスのメンバ関数として定義すると invalid use of non-static member function というエラーが出ます。
なぜこれは禁止されるのでしょうか。
また、どうやって解決したら良いですか。
なぜこれは禁止されるのでしょうか。
また、どうやって解決したら良いですか。
443デフォルトの名無しさん
2019/03/18(月) 05:33:36.55ID:HNvbYtsL エラーメッセージ読みなよ
444デフォルトの名無しさん
2019/03/18(月) 06:41:53.05ID:8TZ/BLJn 理屈を知ってる人には当然だけど、初めての人は混乱する部分じゃないかな。
sort で使う比較関数は色んな形で宣言できるけど、宣言する場所によって
エラーにならずに使える関数の形式が違うってやつ。
>>442 メンバ関数にした比較関数のプロトタイプ宣言はどんな感じ?
sort で使う比較関数は色んな形で宣言できるけど、宣言する場所によって
エラーにならずに使える関数の形式が違うってやつ。
>>442 メンバ関数にした比較関数のプロトタイプ宣言はどんな感じ?
445デフォルトの名無しさん
2019/03/18(月) 08:08:37.98ID:HNvbYtsL 非staticメンバをstaticのように使おうとしたときに出るエラーだからsortとか関係ない
Class::funcをsortに入れたんでしょ
Class().funcとするかfuncをstaticにするだけ
Class::funcをsortに入れたんでしょ
Class().funcとするかfuncをstaticにするだけ
446デフォルトの名無しさん
2019/03/18(月) 08:49:38.19ID:fJqFZa8b 今時はClass().funcでいけるんすか
447デフォルトの名無しさん
2019/03/18(月) 09:58:55.92ID:7+YzgLjV Class::funcってstaticじゃないの?
448デフォルトの名無しさん
2019/03/18(月) 10:42:04.28ID:9EOa0iNV ->*みたいな書き方の意義がわかったら一人前どすな
449デフォルトの名無しさん
2019/03/18(月) 11:13:12.39ID:27d4/ixp ちなみにどんな意義があるの?
450デフォルトの名無しさん
2019/03/18(月) 19:22:09.39ID:SgtRGl5R451デフォルトの名無しさん
2019/03/18(月) 20:05:14.79ID:c3AGzLzz 結局その場でラムダ式書くのが一番わかり易いんだよね
453デフォルトの名無しさん
2019/03/18(月) 21:20:34.54ID:lCR32A1k エクセルで使われているようなGUIにちょっとしたアニメーションをつけるには何使えばいい?
455デフォルトの名無しさん
2019/03/18(月) 21:43:42.87ID:lCR32A1k >>454
例えば四角形の座標の終点の値と移動にかかる時間をするだけでヌルッと動いてくれる機能があるやつがいいです
例えば四角形の座標の終点の値と移動にかかる時間をするだけでヌルッと動いてくれる機能があるやつがいいです
456デフォルトの名無しさん
2019/03/18(月) 21:45:05.39ID:ok5NeesM 普通にcのsort関数使えばいいのに。
キャストしたら負けとでも思ってんのかね。
キャストしたら負けとでも思ってんのかね。
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 コンパイル時ファイル入出力がサポートされればいいわけだ
それにレイトレーシングはまあ確かに冗談も含まれてるだろうけどそれだけ複雑で重い処理でも可能だという技術デモは価値があるだろう
画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか色々できて可能性はあると思うよ
それにレイトレーシングはまあ確かに冗談も含まれてるだろうけどそれだけ複雑で重い処理でも可能だという技術デモは価値があるだろう
画像にフィルタを適用するとかパターンが決まっているエフェクトを生成するだとか色々できて可能性はあると思うよ
■ このスレッドは過去ログ倉庫に格納されています
