引数の型が「のconst int型」である場合TR1 ::バインドはコンパイルできない理由

StackOverflow https://stackoverflow.com/questions/1679603

  •  16-09-2019
  •  | 
  •  

質問

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <deque>
using namespace std;

#include <tr1/functional>
using namespace std::tr1::placeholders;
template<class Function_t>
void for_each_x(Function_t func,int interval)
{
   for(int sc = 0; sc < 10; sc+=interval){
      func((const int)sc);
   }
}
void foo(int x,const int y)
{
}

int main(int argc, char *argv[])
{
   for_each_x(tr1::bind(tr1::function<void(int,const int)>(foo),_1,11),2);
   return 0;
}

のgcc 4.2.2または4.4.1は非常に長いエラーメッセージを表示します。 私は「int型」に「のconst int型を」変更した場合は、エラーメッセージはありません。 しかし、私は本当に関数の引数は参照によって渡された場合、カウンタ変数が事故によって変化していないことを確認する「のconst int型」を持ちたい。

役に立ちましたか?

解決

式は唯一のタイプによって、またそのlvaluenessによって分類されていません。この1は、主に、それがどこかに保存されているかどうかを決定し、それはまた、非const参照にバインドできるかどうかを決定します。非const右辺値(非左辺値)は、非const参照にバインドすることはできませんので、あなたは、次の操作を行う場合は、必ず失敗します:

template<typename T>
void f(T&);
int main() { f(10); f((int const)10); }

2番目の呼び出しは、あなたを驚かせるかもしれませんが、それでも、実際にCV-修飾子は非クラスの右辺値から削除され、そしてそのキャスト式の型はintを持っていることを起こります。だから、関数テンプレートのパラメータの型はint&と推定されます - コンパイルが失敗しました。

さて、前のC ++ 0xのbindは、それを転送し、引数の型と非const参照をサポートしていますので、あなたはそれをconstの引数を与えた場合、それは大丈夫だ - そのテンプレートパラメータがそれを作るだろう、それはconst参照になるように。しかし、あなたはそれを非const引数を与え、そしてそれは右辺値だならば、それはのだではないの罰金、参照パラメータに拘束されることすることができませんので。

scまたはそれがconstの左辺値にキャストして、ある -

あなたは左辺値にバインドオブジェクトを呼び出したいです。通知は、関数のパラメータ型のトップレベルの修飾子が破棄され、そしてそのfoo効果的void(int, int)を入力している - このトップレベルCV-ドロップは、パラメータのすべてのタイプのために起こります。とにかく、解決策はへの呼び出しを変更することです。

for(int sc = 0; sc < 10; sc+=interval){
   func((int const&)sc); // notice &
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top