次のように言えない理由は簡単に理解できます。
template<class A> class foo
{
//stuff
A& operator[](size_type n);
operator A*();
//more stuff
};
somefooinstance[bar];
... 「ISO C++ は、最初の最悪の変換が 2 番目の最悪の変換よりも優れているにもかかわらず、これらはあいまいであると言います。」
もちろん、これが意味することは、gcc は次のことを意味するかどうかわからないということです。
somefooinstance.operator[](bar);
または、次のことを意味します。
(static_cast<A*>(somefooinstance))[bar];
さて、ISO C++ はすべての変換を考慮する必要があると言っていますよね? しかし、選択の優先順位を強制する方法はありませんか? 属性は役に立たないようです。
(「本当に何をしようとしているのか?」という質問には答えないでください。はい、これは既製の例です。アンクル サムは私がコードをカット アンド ペーストすることを望んでいません。)
編集:
誰かが正確なコードを見たいと思っていました:
template<class T, unsigned S> class foo
{
private:
T m_bar[S];
public:
inline T& operator[](unsigned s)
{
return m_bar[s];
}
inline operator T*()
{
return m_bar;
}
};
int main(int argc, char** argv)
{
foo<int, 100> test;
test[31] = 6;
}
収量:
23 : 警告: ISO C++ は、最初の最悪の変換が 2 番目の最悪の変換よりも優れているにもかかわらず、これらはあいまいであると述べています。
8 : 注: 候補 1: T& foo::operator[](unsigned int) [with T = int, unsigned int S = 100u]
23 : 注:候補2: operator[](int*, int)
... 衒学的な必要はありません。
缶詰の例で申し訳ありません。切り取りと貼り付けが禁止されているということは、実際にコピーと貼り付けができないだけでなく、ルールと規制のために自分が何をしようとしているのかを説明できないということです。