2

これが私のコードです:

#include <iostream>

using namespace std;
class Sales{
  public:
    Sales(int i = 0):i(i){}
    explicit operator int(){ return i; }
  private:
    int i;
};

int main(){
  Sales s(5);
  if(s == 4) cout << "s == 4" << endl;
  else cout << "s != 4" << endl;
  return 0;
}

C ++のプライマー(5番目)では、次のように書かれています:

コンパイラは、条件として使用される式に明示的な変換を適用します

しかし、この場合、そのような変換はありません。を削除するexplicitと、コードは正常に機能します。

ただし、に変更
explicit operator int(){ return i; }すると
explicit operator bool(){ return i != 0; }

それぞれに変更if(s == 4)するif(s)と、コードは正常に機能します。

変換規則は少し混乱しているように見えますが、これについて詳しく説明できる人はいますか?

4

1 に答える 1

4

暗黙的な変換の中で、C++11 以降、明示的なユーザー定義の変換関数はコンテキスト変換と見なされます。これは、次のコンテキストで型boolが期待されるときに発生します。についてintは、適用されません。

次の 5 つのコンテキストではbool、宣言が bool t(e); の場合、型が期待され、暗黙的な変換シーケンスが構築されます。整形式です。つまり、明示的な T::operator bool() const; などの明示的なユーザー定義の変換関数です。考えられている。このような式 e は、文脈上 bool に変換可能であると言われます。

controlling expression of if, while, for;
the logical operators !, && and ||;
the conditional operator ?:;
static_assert;
noexcept.
于 2017-11-23T01:32:06.233 に答える