に暗黙的に変換できる C++ クラスを作成しようとしていますstd::array
。変換は機能しますが、暗黙的ではありません。
#include <array>
class A {
private:
std::array<float, 7> data;
public:
operator std::array<float, 7>&() { return data; }
operator const std::array<float, 7>&() const { return data; }
};
int main() {
A a;
a[1] = 0.5f; // fails to compile
auto it = a.begin(); // fails to compile
A b;
static_cast<std::array<float, 7>>(b)[1] = 0.5f; //ok
auto it2 = static_cast<std::array<float, 7>>(b).begin(); //ok
return 0;
}
private
上記の例は、基本的にクラスのメンバーを完全に公開するため、非常に複雑であることを理解しています。std::array
しかし、これは単純化しすぎた例です。暗黙の変換が機能しない理由の問題に取り組もうとしているだけです。
上記の例を と の両方clang-3.2
で試しましたgcc-4.8
。どちらもコンパイルしません。
さらに困惑するのは、ポインターへの暗黙的な変換を使用すると、コンパイルが明らかに成功することです。
operator float *() { return data.begin(); }
operator const float *() const { return data.cbegin(); }
しかしもちろん、これは の多くの優れた点を失うことを意味しstd::array
、より良い解決策がなければ受け入れます。