2016-03-08 72 views
7

請考慮下面的代碼片段:我們可以在noexcept規範中引用成員變量嗎?

template<class Tuple> 
class vector 
{ 
public: 
    typename Tuple::size_type size() const noexcept(noexcept(m_elements.size())) { 
     return m_elements.size(); 
    } 

private: 
    Tuple m_elements; 
}; 

class tuple 
{ 
public: 
    using size_type = std::size_t; 

    size_type size() const { return 0; } 
    size_type size() noexcept { return 0; } 
};  

int main() 
{ 
    vector<tuple> x; 
    static_assert(noexcept(x.size()), "x.size() might throw"); 

    return 0; 
} 

裏面的noexcept符合法使用成員變量m_elements的? GCC 5.2 (C++17) yields the compiler errorm_elements未在此範圍內申報。而clang 3.6 (C++17) compiles without any error

如果我用noexcept(std::declval<Tuple const&>().size())代替,兩個編譯器都不會產生錯誤。但是,正如您所看到的,我創建了一個簡單的示例類tuple,其中Tuple是否具有合格的size過載是至關重要的。

從我的角度來看,它更直觀地寫noexcept(m_elements.size())因爲它是在函數體完全通話,並考慮到的vectorsize方法是const合格(這使得m_elements一個const對象的範圍功能)。

那麼,法律用法是什麼?如果兩者都相同,我應該使用哪一個?在這種情況下,我應該使用noexcept限定符嗎?問題在於vector函數是否會拋出取決於Tuple的大部分情況。

+0

我想說明的是[有關在noexcept規範中使用成員變量的問題](http://stackoverflow.com/questions/27241938/noexcept-depending-on-method-of - 成員),但請注意,這個問題與C++ 11相關,並且由(某些未知版本的)clang產生的編譯器錯誤。 – 0xbadf00d

回答

5

鏘在這裏是正確的,這是一個海灣合作委員會的錯誤。據[basic.scope.class],重點煤礦:

在一個類中聲明的名稱的潛在範圍不僅包括以下聲明的 名稱的點聲明區,也是所有函數體中,默認參數,例外 - 規範該類中的非靜態數據成員的括號或相等初始值設定項(包括嵌套的 類中的這些內容)。

m_elements範圍包括用於size()noexcept規格

相關問題