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

标签 c++ c++11

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

如果我要做类似...

for( auto i : someclass.Elements() )
{
 ...
}

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

我会在这个问题的底部添加一个工作原型(prototype)。

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

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

这是一个工作原型(prototype):

#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;
} 

最佳答案

请查看下一页,了解关于您可以将 for 替换为心智模型的内容的确切描述:

Range-based for loop

它不仅适用于返回临时的函数,有时还可以通过执行 for (auto&& i : someclass.Elements()) 进行一些优化。

关于c++ - 来自成员函数返回的临时值的基于范围的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176102/

相关文章:

c++ - 将 QObject 用作​​类成员并将该成员用作连接的上下文是否安全?

c++ - libjpeg 的输出是否始终为 RGB(或单色图像的亮度)?

c++ - 为什么我的可变参数模板实例化不起作用?

c++ - boost 软件集成

c++ - 获取发出信号的线程的 ID

c++ - decltype(*&fun) 很奇怪?

c++ - 这两个说法在N4140中不是不兼容吗?

c++ - 在 C++ lldb 中使用重载运算符评估表达式

c++ - 在编译时根据字节顺序定义位域

c++ - 使用cpp代码从加载的qml访问qml对象