2016-07-15 9 views
7

私はthis questionの公式の答えがdecltypeであるべきですトリガー機能のコンパイル。実際には宣言されているが定義されていない関数上のdecltypeは正当です。テンプレート化された関数のアドレスを取得してコンパイルをトリガーする必要がありますか?

次の質問は、関数のアドレスを取って関数のコンパイルをトリガーする必要がありますか? this exampleください:私がテストしてみた

template <typename T> 
void foo(T&& x) { x.func(); } 

int main() 
{ 
    auto bar = &foo<int>; 
} 

すべてのコンパイラをのようなエラーで失敗:非クラス型であるxのメンバーfuncため

要求、int

しかし、私がちょうどfooを定義し、それを宣言しなければ、コードはうまくコンパイルされます。関数のアドレスを取ってコンパイルする必要があるかどうかについて、誰かが私に公式ソースを提供できますか?

+1

http://en.cppreference.com/w/cpp/language/definition%23One_Definition_Ruleによれば、「オブジェクトはそのアドレスが使用されているとodr-usedである」、および「オブジェクトまたは関数がodr-その定義はプログラムのどこかに存在しなければならず、その違反はリンク時のエラーです "。私はこれに答えるために関連する標準引用符を持っていません – KABoissonneault

+0

@ KABoissonneault私はこれでOKです。それらの引用符の両方にhttp://en.cppreference.comを挙げることができれば、私はその公式を十分に考慮するでしょう。 –

+0

@KABoissonneault [あなたが引用しているもの](http://en.cppreference.com/mwiki/index.php?title=cpp/language/definition&diff=prev&oldid=73909)は[Cubbi](http ://スタックオーバーフロー。com/users/273767/cubbi)私は彼に挨拶し、それについてのより多くの情報を得るための方法があることを望みます。 –

答えて

2

3.2/2:それは未評価 オペランド(項5)またはその部分式でない限り

発現は、潜在的に評価されます。 ...オーバーロードされない 関数が潜在的に評価される式として表示されるか、または が候補関数のセットのメンバーになる場合、オーバーロードによって選択された場合 潜在的に評価される式から参照される場合、 はodr-純粋な仮想関数であり、その名前が明示的に修飾された でない場合を除きます。その後

3.2/3:

は、すべてのプログラムがそのプログラムにODR-使用されているすべての非インライン 関数や変数の正確に一つの定義を含まなければなりません。診断なし が必要です。定義はプログラム内で明示的に現れることがあり、標準またはユーザ定義のライブラリには があります(または が適切な場合)。暗黙的に定義されています(12.1,12.4および 12.8を参照)。インライン関数は、それがodr使用されるすべての翻訳単位で定義されなければならない。

関数名は間違いなく(sizeofdecltypeに例えば)未評価のオペランドではありません、それは式の中で表示されますので、それが潜在的に評価されています。次に、2つ目は、正確に1つの非インライン定義、または各翻訳単位のインライン定義が必要です。

+0

これはあなたのロジックの要点です:評価された式は... odr-usedです」しかし、関数のアドレスを取ってどこを評価しているのかわかりません。たとえば 'decltype(foo(int {13}))'は 'foo'を評価していません。 '&foo 'はそれを評価していますか?私はこれらの引用符からはわかりません。 –

+2

@Jonathan Mee *は、decltypeへのオペランドのようなコンテキストは潜在的に評価されないが、式に名前が現れる可能性がある他のコンテキストでは潜在的に評価されることを明示的に述べている。 –

+0

@JonathanMeeこのように考えると、 'bar'は 'foo 'をインスタンス化せずに関数ポインタとしてどのように動作するのでしょうか?また、これは 'static const int = 4;のようなものでリンカエラーが発生するのと同じ状況です。 int j; std :: min(i、j) ' – Barry

関連する問題