请考虑以下代码片段:
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;
}
是成员变量的使用m_elements
在 - 的里面noexcept
说明符合法吗?GCC 5.2 (C++17) 产生编译器错误 http://coliru.stacked-crooked.com/view?id=7d2a18fa7e70f9e0 m_elements
在这方面没有申明. while clang 3.6 (C++17) 编译没有任何错误 http://coliru.stacked-crooked.com/view?id=13b213cf8de3b9b1.
如果我使用,两个编译器都不会产生错误noexcept(std::declval<Tuple const&>().size())
反而。但是,正如您所看到的,我创建了一个简单的示例类tuple
是否至关重要Tuple
具有合格的过载size
.
从我的角度来看,这样写更直观noexcept(m_elements.size())
因为它正是函数体中的调用,并且它考虑到了size
的方法vector
is const
合格(这使得m_elements
函数范围内的 const 对象)。
那么,合法用途是什么?如果两者等效,我应该使用哪一个?我应该使用noexcept
在这种情况下有资格赛吗?问题在于,无论vector
在大多数情况下,函数会抛出依赖于Tuple
.
Clang 在这里是正确的,这是 gcc bug52869 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52869。根据[基本.范围.类] http://eel.is/c++draft/basic.scope.class#1,强调我的:
类中声明的名称的潜在范围不仅包括以下声明区域
名称的声明点,也是所有函数体、默认参数的声明点,异常规范, and 大括号或等号初始化器该类中的非静态数据成员(包括嵌套中的此类内容)
类)。
范围m_elements
包括noexcept 规范 for size()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)