gpt4 book ai didi

c++ - 尾随返回类型、decltype 和 const-ness

转载 作者:IT老高 更新时间:2023-10-28 22:21:48 25 4
gpt4 key购买 nike

我只是在尝试新的尾随返回类型,但我遇到了这个(简化的)代码的问题

#include <list>

class MyContainer{
std::list<int> ints;

auto begin( ) -> decltype(ints.begin())
{
return ints.begin();
}

auto begin( ) const -> decltype(ints.begin())
{
return ints.begin();
}
};

忽略这段代码毫无意义的事实。重要的部分是使用 GCC 4.6.1 时产生的编译器错误(带有 -std=c++0x 标志):

In member function 'std::list<int>::iterator MyContainer::begin() const':
error: could not convert '((const MyContainer*)this)->MyContainer::ints.std::list<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>, std::list<_Tp, _Alloc>::const_iterator = std::_List_const_iterator<int>]()' from 'std::list<int>::const_iterator {aka std::_List_const_iterator<int>}' to 'std::list<int>::iterator {aka std::_List_iterator<int>}'

如果您不喜欢涉及模板的错误,那么简短的故事就是 const 的正文中的内容。 MyContainer::begin 的版本, 表达式 ints.begin()返回 std::list<int>::const_iterator 类型的值(因为在这种情况下 intsconst)。但是,decltype(ints.begin())产生类型 std::list<int>::iterator ,即 decltype 忽略 const begin 的限定符确定表达式类型时的方法。不出所料,结果是类型冲突。

在我看来,这似乎是 GCC 编译器中的一个错误。仅对 decltype 有意义向 const 致敬限定符并产生 const_iterator类型。任何人都可以确认或否认(甚至可能解释)这一点吗?也许我忽略了 decltype 的机制中的某些内容,但这看起来是一个非常简单的场景。

注意:据我所知,同样的行为不仅适用于 std::list<int> , 但对于在 const 上重载成员函数的任何类型-ness 返回不兼容的类型。

最佳答案

你是对的,这是一个错误。根据 N3291 第 5.1.1 节第 3 段:

If a declaration declares a member function or member function template of a class X, the expression this is a prvalue of type “pointer to cv-qualifier-seq X” between the optional cv-qualifer-seq and the end of the function-definition, member-declarator, or declarator. It shall not appear before the optional cv-qualifier-seq and it shall not appear within the declaration of a static member function (although its type and value category are defined within a static member function as they are within a non-static member function). [Note: this is because declaration matching does not occur until the complete declarator is known. —end note ] Unlike the object expression in other contexts, *this is not required to be of complete type for purposes of class member access (5.2.5) outside the member function body. [Note: only class members declared prior to the declaration are visible. —end note ]

但这是最近的工作草案和 N3291 之间的变化。所以 GCC 在不到 6 个月前是正确的。这就是根据动态规范编写代码的危险。

关于c++ - 尾随返回类型、decltype 和 const-ness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com