传递函数参数时的 C++ 执行顺序
C++ execution order when passing function arguments
具有以下接口的容器class:
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++ 标准是否对计算函数参数时的执行顺序有任何具体说明?
说订单完全未指定。
排序规则太复杂,无法在这里重现,而且很难证明是否定的,但是一个非规范的注释方便地为我们总结了它:
[C++11: 5.2.2/4]:
When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. [ Note: Such initializations are indeterminately sequenced with respect to each other (1.9) — end note ] [..]
(C++14 中的相同文本。)
具有以下接口的容器class:
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++ 标准是否对计算函数参数时的执行顺序有任何具体说明?
说订单完全未指定。
排序规则太复杂,无法在这里重现,而且很难证明是否定的,但是一个非规范的注释方便地为我们总结了它:
[C++11: 5.2.2/4]:
When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. [ Note: Such initializations are indeterminately sequenced with respect to each other (1.9) — end note ] [..]
(C++14 中的相同文本。)