請考慮下面的代碼片段:我們可以在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())
因爲它是在函數體完全通話,並考慮到的vector
的size
方法是const
合格(這使得m_elements
一個const對象的範圍功能)。
那麼,法律用法是什麼?如果兩者都相同,我應該使用哪一個?在這種情況下,我應該使用noexcept
限定符嗎?問題在於vector
函數是否會拋出取決於Tuple
的大部分情況。
我想說明的是[有關在noexcept規範中使用成員變量的問題](http://stackoverflow.com/questions/27241938/noexcept-depending-on-method-of - 成員),但請注意,這個問題與C++ 11相關,並且由(某些未知版本的)clang產生的編譯器錯誤。 – 0xbadf00d