7

C ++ 11標準を確認したところ、次の事実が見つかりました。

  1. std::getline(fin, str)basic_iosクラスにメンバー関数があるオブジェクトを返しますexplicit operator bool() const;

  2. このクラスには、 C++11より前basic_iosのメンバー関数はありません。operator void*() const;

if (getline(fin, str)) {}ですから、標準適合ではないと思います。それは次のように書く必要があります

if (bool(getline(fin, str)){}。(ただし、VC ++ 2012は、この使用法について警告を出します。つまり、void *を強制的にブール値にします)

私は正しいですか?

4

3 に答える 3

12

コードは準拠しています。オブジェクトが条件として自動的にbool使用されるときに、toの明示的な変換演算子が呼び出されます。標準の変更は、同じ使用法を維持しながら、少し安全にすることを目的としていました。

于 2013-02-06T03:20:23.337 に答える
8

explicit operator bool(そして唯一の )は、特定の状況explicit operator boolで暗黙的にに変換できるようにする特別な言語を持っています。この変換の仕様言語は「コンテキストに応じて」に変換されます。boolbool

これらは、言語がブールテストを行う場所です。で使用される条件式if/while/forは、「コンテキストに応じてbool」に変換されます。論理演算子と条件演算子(?:)も同様です。

したがって、これらを行うことはできませんが、次のようになります。

bool b = std::getline(fin, str);
void func(bool) {}
func(std::getline(fin, str));

あなたはこれらを行うことができます:

while(std::getline(fin, str)) {...}
for(;std::getline(fin, str);) {...}
if(std::getline(fin, str) && somethingElse) {...}
于 2013-02-06T04:21:06.523 に答える
6

デビッドは正しいです、そしてここに彼をバックアップするための引用があります。§12.3.2/2では、規格は

変換関数は明示的(7.1.2)である場合があり、その場合、直接初期化(8.5)のユーザー定義変換としてのみ見なされます。それ以外の場合、ユーザー定義の変換は、割り当てと初期化での使用に制限されません。[

class Y { };
struct Z {
    explicit operator Y() const;
};

void h(Z z) {
    Y y1(z); // OK: direct-initialization
    Y y2 = z; // ill-formed: copy-initialization
    Y y3 = (Y)z; // OK: cast notation
}

終了例]

このコンテキスト変換が発生する場所のいくつかは、オペランドから!、、オペランドから、、&&およびの条件ですif

したがって、直接初期化では、明示的な変換演算子を使用できます。§4/3では、

式eは、宣言が整形式Tである場合にのみ、いくつかの発明された一時変数t(8.5)に対して、暗黙的に型に変換できます。特定の言語構造では、式をブール値に変換する必要があります。そのような文脈で現れる式eは、文脈上boolに変換されると言われ、宣言が整形式である場合にのみ整形式になります。T t=e;bool t(e);t

ご覧のとおり、標準ではコンテキスト変換の直接初期化が指定されているため、明示的な変換はif条件で機能します。

于 2013-02-06T04:20:35.903 に答える