簡體   English   中英

C ++ 0x,用戶定義的文字與朋友操作符“”()

[英]C++0x, user-defined literals with friend operator “”()

operator "" (...)定義為友元函數是否可行和/或有用?

class Puzzle {
  friend Puzzle operator "" _puzzle(const char*, size_t);
  ...
};
void solve(Puzzle);
int main() {
  solve("oxo,xox"_puzzle);
};

我正在考慮“有用”,特別是因為operator ""應在命名空間中定義的規則 - 至少是因為以_開頭的標識符在全局命名空間中保留。 這位friend在這里違反了這條規則嗎? 所以,這種不完全封裝沒有任何好處,對吧?

標准直接解決了這個問題,它提到了對用戶定義文字聲明的任何限制,§13.5.8/ 2:

聲明者id是文字操作符id的聲明應該是命名空間范圍函數或函數模板的聲明( 它可以是友元函數(11.3) ),函數模板的顯式實例化或特化,或者使用聲明(7.3.3)。

如果朋友也在命名空間范圍內聲明,那么類或命名空間范圍中的定義之間沒有區別。 請注意,在命名空間范圍內不需要定義,這是您當前提出的問題斷言。

如果未在命名空間范圍內聲明,因為ADL無法找到它,所以可以通過常規非限定名稱查找在該范圍內私有地使用該朋友。 這是聲明不是外部接口的文字運算符的唯一方法。

如果朋友是在類模板中定義的,那么模板的兩個實例將在命名空間范圍內生成兩個具有相同名稱的函數,即使它們在類范圍外都是不可見的,它們也會發生碰撞。

如果它有助於語法,這里是我如何在類中聲明朋友用戶定義的文字運算符,其中運算符本身在命名空間中:

class Integer;
namespace literals {
  Integer operator "" _I (const char *);
}

// Infinite precision integer 
class Integer {
  public:

  // Basic constructor & destructor
   Integer ();
  ~Integer ();

... rest of the interface ...

  // Literal operator
  friend Integer literals::operator "" _I (const char *);

  private:

  struct Detail;
  std::unique_ptr<Detail> detail;

};

用戶using namespace literals;運算符using namespace literals; 聲明只有在他們想要的時候。 (實際上,所有這些都在父命名空間中,但你明白了)。

根據標准,是的,朋友聲明應該是合法的。 順便說一句,該名稱適用於用戶代碼,因為它甚至在全局命名空間中以下划線開頭。

朋友聲明將允許操作員訪問類私有數據。

我開始質疑朋友文字運算符的用處。 因為用戶定義的運算符只能有一些參數列表,所以無法將類放在參數中。 因此現在有依賴於參數查找的方法來找到正確的函數。 我對嗎?

暫無
暫無

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

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