为什么b.isEm()在不同的行上打印不同的东西?

时间:2016-08-03 09:59:37

标签: c++ c++11

为什么b.isEm()在最后一次调用b.isEm()后没有改变任何内容时在不同的行上打印不同的内容?

#include <iostream>
#include <string>

template <class T>
class Box
{
    bool m_i;
    T m_c;

public:
    bool isEm() const;
    void put(const T& c);
    T get();
};


template <class T>
bool Box<T>::isEm() const
{
    return m_i;
}

template <class T>
void Box<T>::put(const T& c)
{
    m_i = false;
    m_c = c;
}

template <class T>
T Box<T>::get()
{
    m_i = true;
    return T();
}


int main()
{
    Box<int> b;
    b.put(10);

    std::cout << b.get() << " " << b.isEm() << std::endl; 
    std::cout << b.isEm() << std::endl;
}

1 个答案:

答案 0 :(得分:1)

C ++中的order of evaluation函数参数未指定。

std::cout << b.get() << " " << b.isEm() << std::endl; 
std::cout << b.isEm() << std::endl;

由于b.get()有副作用,我建议你单独调用它......

auto g = b.get();
std::cout << g << " " << b.isEm() << std::endl; 
std::cout << b.isEm() << std::endl;

注意:std::cout << .... << ... <<是一个带有参数...的函数调用