この機能があれば
template<typename T> f(T&);
そして、それを呼び出してみてください。次のような右辺値としましょう
f(1);
T が const int であると推定されず、引数が const int& になり、右辺値にバインド可能になるのはなぜですか?
この機能があれば
template<typename T> f(T&);
そして、それを呼び出してみてください。次のような右辺値としましょう
f(1);
T が const int であると推定されず、引数が const int& になり、右辺値にバインド可能になるのはなぜですか?
これは、最近の C++0x 転送に関する質問でリンクしたドキュメントで、潜在的な解決策として言及されています。
かなりうまく機能しますが、既存のコードが壊れます。考慮してください(ドキュメントから直接):
template<class A1> void f(A1 & a1)
{
std::cout << 1 << std::endl;
}
void f(long const &)
{
std::cout << 2 << std::endl;
}
int main()
{
f(5); // prints 2 under the current rules, 1 after the change
int const n(5);
f(n); // 1 in both cases
}
または
// helper function in a header
template<class T> void something(T & t) // #1
{
t.something();
}
// source
#include <vector>
void something(bool) // #2
{
}
int main()
{
std::vector<bool> v(5);
// resolves to #2 under the current rules, #1 after the change
something(v[0]);
}
これは値カテゴリ (左辺値または右辺値) の転送にも失敗しますが、これは C++03 ではあまり問題になりません。しかし、この修正は C++0x でしか実行できなかったため、転送時に右辺値参照から効果的に遮断されていました (悪いことです)。より良い解決策を模索する必要があります。
fそれは、あなたが取ると宣言した場合に限りますT const &。
template <typename T> void f(T &);
template <typename T> void g(T const &);
void x() { f(1); } // error: invalid initialization of non-const reference
void y() { g(1); } // no error
と の両方 を宣言するf(T &)とf(T const &)、const 修飾された方が選択されます。
template <typename T> void f(T &);
template <typename T> void f(T const &);
void x() { f(1); } // no error, calls f(T const &)
ここで、「最初の例で、一時的な型を生成してコードをコンパイルできるのに、なぜintへの呼び出し用に一時的な型を生成するのか?」と言っているかもしれません。私があなたに持っている最良の答えは、引数が整数定数でない場合、オーバーロード解決の動作と矛盾するということです。fconst int