18

関連する質問では、非メンバーのconst関数へのポインターなどはないと言われています。さらに、C ++ 11 8.3.5/6は

関数宣言子でのcv-qualifier-seqの効果は、関数型の上にcv-qualificationを追加することと同じではありません。後者の場合、cv-qualifiersは無視されます。[注:cv-qualifier-seqを持つ関数型は、cv修飾型ではありません。cv修飾関数型はありません。—エンドノート]

私が正しく理解していれば、これは非メンバーのconst関数のようなものがないことを意味します。(このような関数はconstではありませんが、3.10 / 6に従って変更することはできません)。特に、const関数へのポインタは無意味です。

ただし、一部のコンパイラは、型推論コンテキストでconst関数へのポインタを作成しているようです。たとえば、次のコードについて考えてみます。

#include <iostream>

void f() {}

template <typename T> void g(      T*) { std::cout << "non const" << std::endl; }
template <typename T> void g(const T*) { std::cout << "const    " << std::endl; }

int main() {
     g(f);
}

GCCとIntelでコンパイルすると、上記の引用から予想されるように、コードは「nonconst」を出力します。ただし、ClangおよびVisual Studioでコンパイルすると、出力は「const」になります。

私の解釈は正しいですか?

アップデート:

コメントに続いて、私はconstメンバー関数について話しているのではないことを明確にしようとしています。非メンバー関数に興味があります(ただし、同じ引数が非静的メンバー関数にも当てはまる可能性があります)。また、質問のタイトルをより正確にするために変更しました。

上記の解像度と一致して、g(f)以下の行はGCCとIntelには違法ですが、ClangとVisualStudioには違法ではありません

const auto* ptr = &f;

アップデート2:

私はAndyProwlの解釈に同意し、彼の答えを選択しました。しかし、その後、この質問はCWGの未解決の問題であることに気づきました。

4

1 に答える 1