「intchar」の2つのタイプで変数を宣言する


81

私はC ++の初心者で、Bjarne Stroustrupのプログラミング:C ++を使用した原則と実践を読んでいます

3.9.2安全でない変換に関するセクションで、著者は言及しました

イニシャライザが整数リテラルの場合、コンパイラは実際の値をチェックし、ナローイングを意味しない値を受け入れることができます。

int char b1 {1000};     // error: narrowing (assuming 8-bit chars)

私はこの宣言に戸惑っています。2つのタイプ(intchar)を使用します。私はこれまでJavaとSwift(私が比較的よく知っている2つの言語)でそのような宣言を見たことがありません。これはタイプミスですか、それとも有効なC ++構文ですか?


2
その本のどの版と印刷物を持っていますか?その本の正誤表を探しましたか?
一部のプログラマーは

2
それで、あなたはどのバージョンを読んでいますか?Bjarneはこの間違いについて知りたいと確信しています。
StoryTeller-Unslander Monica 2018年

1
3.9.2安全でない変換安全でない変換とは、値が元の値と等しくない別のタイプの値に暗黙的に変換される可能性があることを意味します。例:int i = 20000; char c = i; このような変換は、「ナローイング」変換と呼ばれます。double to int、charまたはbool int
tochar

15
これfloat charは、特にスイミングプールで役立つもう1つのタイプです。ビール用のホルダーが付いているものもあります。
Yakk-Adam Nevraumont 2018

1
これはタイプミスですか、それとも有効なC ++構文ですか? 試してみてください(OK、OK、いいえ、無効です)。
ポールサンダース

回答:


95

それは本の間違いです。これは、想定されるナローイング変換がなくても、有効なC ++宣言ではありません。

しかし、Bjarne Stroustrupのページ(4回目以前)正誤表には記載されていませんが、これは奇妙なことです。それは明らかに十分な間違いです。//error宣言自体の間違いに気付く人は少ないので想像します。


この本で意図されたコード例はおそらく何でしたか?
ペドロA

8
@Hamsterrific char b1 {1000};(コメントに記載されているエラーが発生するため)。その日、ビャルネのタイピングの指は疲れていたと思います。
ポールサンダース

1
@PaulSanders疲れましたか?彼はintそこに余分なものをタイプしました!:-)
レオ

1
@ LeoHeinsaarLol。OK、コーヒーが多すぎます:)または、吃音があるかもしれません:)
Paul Sanders

ええ:指が疲れています。前の例からのカットアンドペーストエラーのように見えます。その前の例では、彼は2行を与えています:int a {1000}; // OK [\ n] char b {a} //エラー:int-> charが狭くなる可能性があり[\ n]、彼はその例を次の例にカットアンドペーストし、「int」部分の削除を逃したようです:int char b1 {1000}; //エラー:ナローイング(8ビット文字を想定)[\ n] char b2 {48}; // OK [\ n]は
L.スコット・ジョンソン

24

その本は間違っている。

トークンシーケンスint char b1{1000};は意味的に有効なC ++ではありません。

b1複数の型で宣言しようとしていますが、意味がありません。


10

間違っています。C / C ++では、ユニオンを使用してマルチタイプ宣言を実行できます。例えば:

union {
    int i;
    char c;
} var;

var.i = 42;
/* OR */
var.c = ‘c’;

ストレージは同じであるため、.cと.iは、同じ値に対するタイプごとのハンドルにすぎません。


6

これはC / C ++構文では間違っています。unions(@Alexの回答を参照)に加えて、std::variant(type-safe union)と呼ばれる使用可能な型の1つだけを格納するC ++の方法があります。

#include <variant>
#include <string>

int main()
{
    std::variant<int, float> v, w;
    v = 12; // v contains int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // same effect as the previous line
    w = v; // same effect as the previous line

//  std::get<double>(v); // error: no double in [int, float]
//  std::get<3>(v);      // error: valid index values are 0 and 1

    try {
      std::get<float>(w); // w contains int, not float: will throw
    }
    catch (std::bad_variant_access&) {}

    std::variant<std::string> v("abc"); // converting constructors work when unambiguous
    v = "def"; // converting assignment also works when unambiguous
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.