[英]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
,它似乎在應該失敗時也成功了。 我是在嘗試做一些非標准的事情,還是Clang
和GCC
在這些版本中不支持這個?
對於MSVC
,靜態斷言在第一個類中成功,在第二個類中失敗:
struct SomePrefab : CRTP::Prefab< SomePrefab >
{
protected:
static void build ( Ent target );
};
struct SomePrefab : CRTP::Prefab< SomePrefab >
{
public:
static void build ( Ent target );
};
而GCC
和Clang
總是能成功找到成員,使受保護的成員仍然無法通過靜態斷言。
概念對可訪問性(公共/私有)完全視而不見。 它們始終是公開的,因此只能訪問可公開訪問的內容。 因此,他們無法檢查是否有非公開聲明的內容。 BuildInaccessible<T>
對於沒有build
成員函數聲明的類 T 和聲明它為私有的類T
一樣true
。
此外,控制一個概念化的界面也不是一個好主意。 如果用戶出於任何原因想要公開聲明,那是他們的責任。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.