2016-05-13 8 views
0

特に指定のない限り、すべてのタイプが署名されていると思いました(intなど)。 char型のオブジェクトが 負の値を保持できるかどうかは、実装定義である...charの実装定義がstd :: stringに影響しますか?

:私はcharのために、それが実際に実装定義だということを知って驚きました。 ...特定の実装では、プレーンchar オブジェクトは、signed charまたは unsigned charと同じ値を取ることができます。どちらが実装定義されていますか。

std::stringは実際にはstd::basic_string<char, ...>です。

このプログラムのセマンティクスは実装から変更できますか?

#include <string> 

int main() 
{ 
    char c = -1; 
    std::string s{1, c}; 
} 
+0

はい、 'std :: sring'のセマンティクスに影響します。 – SergeyA

+0

セマンティクスの変化が何を意味するのかを具体的に説明できますか? – juanchopanza

+0

あなたは具体的になりますか? @SergeyA – user6331143

答えて

2

はい、いいえ。

std::stringはタイプcharのオブジェクトが含まれているので、タイプcharの符号の有無は、その動作に影響を与えることができます。

あなたの問題のプログラム:(任意の出力を生成せずに終了すると「行動」である場合を除く)

#include <string> 

int main() 
{ 
    char c = -1; 
    std::string s{1, c}; 
} 

は、目に見える行動を持っていないので、その動作は、プレーンcharの符号の有無に依存しません。コンパイラはmainの本文全体を合理的に最適化することができます。 (私は確かにあなたが求めている問題ではなく、選んだのコード例にコメント、ここでつべこべしています。)

しかし、このプログラム:

#include <iostream> 
#include <string> 

int main() { 
    std::string s = "xx"; 
    s[0] = -1; 
    s[1] = +1; 
    std::cout << "Plain char is " << (s[0] < s[1] ? "signed" : "unsigned") << "\n"; 
} 

が正しく印刷されますがどちらかPlain char is signedPlain char is unsigned。使用して2つのstd::stringオブジェクトを同様のプログラムを比較し

なお、タイプのoperator<ないは、彼らが道Cのmemcmp作品と同様に、符号なしであるかのように、プレーンchar<扱いするので、文字を符号の有無を区別ありません。

これは99%の時間に関係しません。あなたは、確かに、その動作が符号つき度(char)に依存するコードを書くためにあなたの道から出なければなりません。実装定義であることに注意してください。ただし、署名の重要性がある場合は、signed charまたは(可能性が高い)unsigned charを明示的に使用する必要があります。 charは数値型ですが、文字データを保持するために使用する必要があります。

関連する問題