2015-05-20 6 views
2

класс контейнер со следующим интерфейсом:C++ порядок выполнения при передаче аргументов функции

template <typename T> class DynArray { 
    /// Returns the number of elements in the array. 
    inline size_t GetCount(); 
    /// Releases the internal memory from the \class DynArray 
    /// and returns it. The memory must be deallocated manually. 
    inline T* Release(); 
} 

В вызове функции, как

SomeFunction(arr.GetCount(), arr.Release()) 

я ожидал бы arr.GetCount() быть вызван до arr.Release(), но обратное, по-видимому, происходит, в результате чего первый параметр передается значением 0 вместо фактического размера массива. Я использую Visual Studio 2012.

Знает ли стандарт C++ что-то конкретное относительно порядка выполнения при оценке параметров функции?

+0

стандарт не задает порядок выполнения при передаче в качестве параметров, это оставляется разработчику: http://stackoverflow.com/questions/2934904/order-of-evaluation-in-c-function-parameters – EdChum

ответ

2

В нем говорится, что заказ полностью не указан.

правила секвенирования слишком сложны, чтобы воспроизвести здесь, и это трудно доказать обратное, но ненормативный нота удобно суммирует это для нас:

[C++11: 5.2.2/4]: Когда функция вызывается, каждый параметр (8.3.5) должны быть инициализированы (8.5, 12.8, 12.1) с соответствующим аргументом. [Примечание: Такая инициализация являются неопределенно секвенировала по отношению друг к другу (1.9) - конец примечания][..]

(Идентичный текст на C++ 14.)

Смежные вопросы