タグ付けされた質問 「const」

プログラミングの定数とは、プログラムの実行中に値が固定される定義です。たとえば、ほとんどの言語のリテラルは定数です。参照透過的なプログラミングスタイルでは、すべての定義は一定です。const修飾されたデータストレージ領域(オブジェクト、フィールド、変数、パラメーター)は「変更されない」ため、追加のコードジェネレーターの最適化とプログラムの正確さの追加の静的チェックが可能です。


9
一部のプラットフォームではchar **を使用し、他のプラットフォームではconst char **を使用するC ++関数を移植可能に呼び出すにはどうすればよいですか?
私のLinux(およびOS X)マシンでは、iconv()関数には次のプロトタイプがあります。 size_t iconv (iconv_t, char **inbuf... FreeBSDでは、次のようになります。 size_t iconv (iconv_t, const char **inbuf... C ++コードを両方のプラットフォームでビルドしたいと思います。Cコンパイラでchar**は、const char**パラメータに(またはその逆に)を渡すと、通常、単なる警告が発生します。ただし、C ++では致命的なエラーです。したがって、を渡した場合char**、BSDでコンパイルされません。渡した場合const char**、Linux / OS Xでコンパイルされません。プラットフォームを検出せずに、両方でコンパイルするコードを作成するにはどうすればよいですか? 私が持っていた1つの(失敗した)アイデアは、ヘッダーによって提供されたものをオーバーライドするローカルプロトタイプを提供することでした。 void myfunc(void) { size_t iconv (iconv_t, char **inbuf); iconv(foo, ptr); } これは、iconvCリンケージが必要なために失敗extern "C"し、関数内に配置することはできません(なぜでしょうか) 私が思いついた最良のアイデアは、関数ポインタ自体をキャストすることです。 typedef void (*func_t)(iconv_t, const char **); ((func_t)(iconv))(foo, ptr); しかし、これは他のより深刻なエラーを隠す可能性があります。
91 c++  const  portability 

5
constへのポインターの削除(T const *)
constポインタに関する基本的な質問があります。constポインターを使用して非constメンバー関数を呼び出すことは許可されていません。ただし、constポインターでこれを行うことは許可されています。 delete p; これは、本質的に非const 'メソッド'であるクラスのデストラクタを呼び出します。なぜこれが許可されるのですか?これをサポートするだけですか? delete this; それとも他の理由がありますか?

6
[]演算子がSTLマップのconstではないのはなぜですか?
質問のために考案された例: void MyClass::MyFunction( int x ) const { std::cout << m_map[x] << std::endl } []演算子は非定数であるため、これはコンパイルされません。 []構文は非常にきれいに見えるので、これは残念です。代わりに、私は次のようなことをしなければなりません: void MyClass::MyFunction( int x ) const { MyMap iter = m_map.find(x); std::cout << iter->second << std::endl } これはいつも私を悩ませてきました。[]演算子が非定数なのはなぜですか?
89 c++  const 

6
C ++で参照が「const」ではないのはなぜですか?
「const変数」は、一度割り当てられると、次のように変数を変更できないことを示しています。 int const i = 1; i = 2; 上記のプログラムはコンパイルに失敗します。gccはエラーでプロンプトを出します: assignment of read-only variable 'i' 問題ありません、私はそれを理解できますが、次の例は私の理解を超えています: #include<iostream> using namespace std; int main() { boolalpha(cout); int const i = 1; cout << is_const<decltype(i)>::value << endl; int const &ri = i; cout << is_const<decltype(ri)>::value << endl; return 0; } 出力します true false …

4
constメンバー関数が静的データメンバーを変更できるのはなぜですか?
次のC++プログラムでは、関数から静的データメンバーを変更するconstことは正常に機能しています。 class A { public: static int a; // static data member void set() const { a = 10; } }; ただし、関数から非静的データメンバーを変更するconstことはできません。 class A { public: int a; // non-static data member void set() const { a = 10; } }; constメンバー関数がstaticデータメンバーを変更できるのはなぜですか?
86 c++  function  c++11  static  const 

5
キーワード「const」は値を不変にしません。どういう意味ですか?
ありますconstの定義でES6を探る博士アクセルRauschmayerでは: constletのように機能しますが、宣言する変数はすぐに初期化する必要があり、後で変更できない値を使用します。[…] const bar = 123; bar = 456; // TypeError: `bar` is read-only それから彼は書いています 落とし穴:constは値を不変にしません const 変数が常に同じ値を持つことを意味するだけですが、値自体が不変である、または不変になることを意味するわけではありません。 私はこの落とし穴と少し混乱しています。const誰かがこの落とし穴でを明確に定義できますか?

3
1つの関数呼び出しC ++を使用して複数の定数クラスメンバーを初期化する
2つの異なる定数メンバー変数があり、どちらも同じ関数呼び出しに基づいて初期化する必要がある場合、関数を2回呼び出さずにこれを行う方法はありますか? たとえば、分子と分母が定数である分数クラス。 int gcd(int a, int b); // Greatest Common Divisor class Fraction { public: // Lets say we want to initialize to a reduced fraction Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b)) { } private: const int numerator, denominator; }; これにより、GCD関数が2回呼び出されるため、時間が無駄になります。新しいクラスメンバーを定義し、gcd_a_b最初にgcdの出力を初期化リストのそれに割り当てることもできますが、これによりメモリが無駄になります。 一般に、関数呼び出しやメモリを無駄にせずにこれを行う方法はありますか?初期化リストに一時変数を作成できますか?ありがとうございました。

4
Cの絶対値関数がconst入力を受け入れないのはなぜですか?
Cでは、絶対値関数(floatを受け入れる)のプロトタイプは次のとおりです。 float fabsf( float ); このプロトタイプが次のように定数値を受け入れないのはなぜですか。 float fabsf( float const ); fabsfは入力の値を変更しませんか? 入力を受け入れてfabsfを呼び出す関数がある場合、入力をconstとして指定しないように強制されますか? この状況でconstの正確さを処理する適切な方法は何ですか?

1
コピーでもクローンでもないグローバル定数は、Rustでどのように機能しますか?
次のスニペット(遊び場)があるとしましょう struct A { pub val: u32 } const GLOBAL_A: A = A {val: 2}; fn main() { let some_a: A = GLOBAL_A; let other_a: A = GLOBAL_A; println!("double val = {}", some_a.val + other_a.val); } ももAでもCloneないのでCopy、の値GLOBAL_Aが移動されると思います。これはconstにはあまり意味がなく、示されているように、2回「移動」できるため、とにかくそうなることはありません。 上記のスニペットを考慮動作するようルールはどのようなものAではありませんCloneやCopy?
20 rust  const  move 

3
非constへのポインターと同じアドレスのconst引数へのポインターを使用した関数呼び出し
データの配列を入力し、ポインターを使用して別のデータの配列を出力する関数を書きたいのですが。 コンパイラがconstを最適化できることを知っているので、両方が同じアドレスsrcをdst指している場合、結果はどうなのかと思います。未定義の動作ですか?(CとC ++の両方にタグを付けました。これは、答えが異なるかどうかわからないためです。両方について知りたいのです。) void f(const char *src, char *dst) { dst[2] = src[0]; dst[1] = src[1]; dst[0] = src[2]; } int main() { char s[] = "123"; f(s,s); printf("%s\n", s); return 0; } 上記の質問に加えてconst、元のコードでを削除すると、これは明確になりますか?

2
(同じ名前の)新しいsegmentIdをマッピング配列に追加したいが、elementIdは異なるがメソッドは同じ
以下はMapperInterface.phpです if-elseステートメントをconstに追加する方法を理解しようとしています。マッピング配列。そのような何か: if (LIN02 == “VN”) o Treat LIN03 as the SKU · else if (LIN04 == “VN”) o Treat LIN05 as the SKU <?php declare(strict_types=1); namespace Direct\OrderUpdate\Api; use Direct\OrderUpdate\Api\OrderUpdateInterface; /** * Interface MapperInterface * Translates parsed edi file data to a \Direct\OrderUpdate\Api\OrderUpdateInterface * @package Direct\OrderUpdate\Api */ interface MapperInterface { …
14 php  arrays  mapping  const 

2
どのようにconst exprを非常に速く評価できますか
コンパイル時に評価されるconst式を試してみました。しかし、コンパイル時に実行すると信じられないほど高速に見える例を試してみました。 #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } このコードを実行すると、実行に約7秒かかります。ここまでは順調ですね。しかし、私long int res = fib(45)がconst long int res = fib(45)それに変更するとき、それは1秒もかかりません。私の理解では、コンパイル時に評価されます。 しかし、コンパイルには約0.3秒かかります コンパイラーはこれをどのように迅速に評価できますか?しかし、実行時はそれよりはるかに時間がかかりますか?私はgcc 5.4.0を使用しています。
13 c++  const  constexpr 


2
Cのconst修飾子とC ++のconst修飾子の違いは何ですか?
I'veが見つかりました。コメント、ユーザのRを...: CとC ++は同じ言語ではありません。特に、C constはC ++とは何の関係もありませんconst。 constCのconst修飾子とC ++ の修飾子の違いの1つは、そのデフォルトのリンケージです。 constC ++では、修飾子を使用して名前空間スコープで宣言されたオブジェクトは内部リンケージを持ちますが、Cではconst、グローバルスコープで宣言された修飾子を持つオブジェクト(static前に修飾子を持たないconst)は外部リンケージを持ちます。 しかし、CとC ++の言語間で他にどのように異なるのですか?両方の言語で、どちらも同じ種類の概念と目的を持っていると思いました。 私の質問: Cのconst修飾子とC ++のconst修飾子の違いは何ですか? 回答「ポーラ」はどのようにCとC ++で異なりますか?正確な差異指していない間の文脈におけるCおよびC ++の言語const修飾子を。特定の言語で実行できない、または実行できることのみ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.