簡體   English   中英

檢查靜態成員隱私的概念

[英]Concept for Checking Static Member Privacy

我有一個C++20概念,旨在允許 CRTP 接口防止模板化類型公開公開靜態成員:

template< typename T >
concept BuildInaccessible = !requires
{
    T::build ( Ent {} );
};

然后我像這樣使用它:

static_assert ( BuildInaccessible< T >, "... must declare ... as a non-public static member" );

  • 使用MSVC 17.4.1 ,約束可以完美運行。
  • 使用Clang 15時,即使成員受到保護,約束似乎也會成功。
  • 使用GCC 12 ,它似乎在應該失敗時也成功了。

我是在嘗試做一些非標准的事情,還是ClangGCC在這些版本中不支持這個?


對於MSVC ,靜態斷言在第一個類中成功,在第二個類中失敗:

struct SomePrefab : CRTP::Prefab< SomePrefab >
{
protected:

    static void build ( Ent target );

};
struct SomePrefab : CRTP::Prefab< SomePrefab >
{
public:
    
    static void build ( Ent target );
    
};

GCCClang總是能成功找到成員,使受保護的成員仍然無法通過靜態斷言。

概念對可訪問性(公共/私有)完全視而不見。 它們始終是公開的,因此只能訪問可公開訪問的內容。 因此,他們無法檢查是否有非公開聲明的內容。 BuildInaccessible<T>對於沒有build成員函數聲明的類 T 和聲明它為私有的類T一樣true

此外,控制一個概念化的界面也不是一個好主意。 如果用戶出於任何原因想要公開聲明,那是他們的責任。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM