2014-03-31 55 views
3

我已經瞭解到,除非朋友聲明是定義,否則C++ 11標準不允許朋友函數具有默認參數。因此,這是不允許的:爲什麼不能聲明的朋友函數具有默認參數?

class bar 
{ 
    friend int foo(int seed = 0); 
}; 

inline int foo(int seed) { return seed; } 

但這是:

class bar 
{ 
    friend int foo(int seed = 0) 
    { 
     return seed; 
    } 
}; 

(例禮貌http://clang-developers.42468.n3.nabble.com/Clang-compile-error-td4033809.html

這是什麼決定背後的理性?具有默認參數的朋友函數是有用的,例如如果這個功能太複雜以至於無法申報,爲什麼他們現在不被允許?

回答

5

在看着DR 136,看起來好像有一個問題,當一個朋友的聲明與命名空間級別的聲明結合在一起使默認參數變得很難理解(也許難以發出質量診斷),尤其是在模板的上下文。在聲明是該程序中唯一的聲明時,該頁面上提出的DR解決方案僅允許默認參數。由於函數定義也是一個聲明,這意味着在朋友聲明中指定默認參數的唯一有用方法是將其定義爲一個定義。我猜想C++ 11標準只是簡單地選擇使這個實際的使用要求明確。 (技術上來說,如果通過「程序」它們表示「翻譯單元」,則可以構建完整的程序,其中函數是在完全不同的翻譯單元中定義的,但是由於該函數的定義不具有可見的類定義,友誼補助金的好處很大程度上是無用的。)

此打嗝的解決方法似乎非常簡單。聲明朋友而不使用默認參數,然後在名稱空間範圍內再次聲明它,並使用任何默認參數。

相關問題