std::is_constructible
とstd::is_destructible
を評価すると、ClangとGCCはfriend
宣言を守らないようです。 is_constructible `に関して友人宣言による影響を受けていないis_constructibleとis_destructible
アクセスチェックがTとargs内の型のいずれかに無関係文脈からいるかのように実行されます。変数定義の直後のコンテキストの妥当性のみが考慮されます。
(サイトは、アクセスチェックでどのようにis_destructible
取引を説明しますが、アクセス修飾子しないは、一般的にis_destructible
の動作に影響を与えないので、私はそれがis_constructible
と同じように動作することを期待したい。)
ローカル変数のインスタンス化によって証明されるように即時コンテキストでコンストラクタとデストラクタをご確認のは、利用可能なのでしたがって、それは、このコードはないコンパイルする必要がありますように私には思える:
class Private
{
Private() {}
~Private() {}
friend class Friend;
};
class Friend
{
public:
Friend()
{
// Both of these should fire, but they do not.
static_assert(
!std::is_constructible<Private>::value,
"the constructor is public");
static_assert(
!std::is_destructible<Private>::value,
"the destructor is public");
// There is no error here.
Private p;
}
};
...しかし、Coliru compiles it without error(GCCまたはClangを使用)。
コンパイラのバグ(または少なくとも不適合)、またはcppreference.comが標準を欺いている、あるいは私がcppreference.comの記述を誤解していますか?
これは基本的に標準からの直接の引用です(カップルワードを変更して)。また、それは「即時の文脈」が意味するものではない。 –
@ T.C。私は "直接的な文脈"が標準語で何を意味するのか分かりませんが、 'is_constructible'の結果はオブジェクトが*の次のコード行*に構築できるかどうかについては何も教えてくれません。 –
代わりに、同じ型( 'is_constructible')*は、使用する場所によって異なる基本クラス*を持ちます。 –