来自成员函数返回的临时值的基于范围的循环

Kit*_*t10 4 c++ c++11

我有点不确定新的(从 c++11 开始)基于范围的循环内部是如何工作的。

如果我要做类似的事情...

for( auto i : someclass.Elements() )
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

...其中“Elements()”返回临时值,是否有任何我可能不知道的副作用?

我将在这个问题的底部添加一个工作原型。

我已经验证“Elements()”返回的类型被创建一次,这是我最关心的。说实话,这感觉有点简单了,而且我还没有在其他地方看到过这种实现。

对于上下文,我创建了一个 XML 库,并且希望能够迭代元素的子元素 ("for( auto child: element->Children() ) {...}"),它的属性 ("for( auto attribute : element->Attributes() ( {...}"),也许还有更具体的子元素 ("for( auto cats : element->Children( "cats" ) ) {...}"。

这是一个工作原型:

#include <iostream>
#include <list>
#include <vector>
#include <string>

template< typename T >
class Array
{
public:
    Array()
    {       
    }

    Array( T firstValue )
    {
        m_elements.push_back( firstValue );
    }

    Array( const std::list< T > & values )
    {
        m_elements.insert( m_elements.begin(), values.begin(), values.end() );
    }   

    virtual ~Array() 
    {
    }

    void Add( T value )
    {
        m_elements.push_back( value );
    }

    const T & operator[]( int index ) const
    {
        return m_elements[ index ];
    }   

    size_t Count() const
    {
        return m_elements.size();
    }

    class ElementsIterable
    {
        Array & m_array;
    public:
        ElementsIterable( Array & array ) : m_array( array )
        {
            std::cout << "ElementsIterable Constructed" << std::endl;
        }

        class iterator
        {
        public:
            iterator( Array & array, size_t index )
                : m_array( array ), m_index( index )
            {
            }

            iterator & operator++()
            {
                m_index++;
                return *this;
            }

            bool operator!=( const iterator & itr ) const
            {
                return m_index != itr.m_index;
            }

            const T & operator*() const
            {
                return m_array[ m_index ];
            }

        private:
            Array & m_array;
            size_t m_index;
        };

        iterator begin() {
            return iterator( m_array, 0 );
        }
        iterator end() {
            return iterator( m_array, m_array.Count() );
        }
    };

    ElementsIterable Elements()
    {
        return ElementsIterable( *this );
    }

private:
    std::vector< T > m_elements;
};

int main( int argc, char ** argv )
{
    Array< int > array( { 1, 2, 3 } );
    array.Add( 4 );

    for( auto a : array.Elements() )
    {
        std::cout << a << std::endl;
    }

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

lor*_*rro 6

for请参阅下页,了解可以用什么来替换心智模型的准确描述:

基于范围的 for 循环

它不仅可以与返回临时的函数一起使用,有时还可以通过执行for (auto&& i : someclass.Elements()).

  • @kfsone `auto&amp;&amp;` 与 `T&amp;&amp;` 相同。它们都是[转发参考文献](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4164.pdf) (2认同)