Commit eb0f1cc7 by Jason Rhinelander

Only allow unchecked()/mutable_unchecked() on an lvalue

This should mitigate accidental invocation on a temporary array.

Fixes #961.
parent 7918bcc9
...@@ -689,7 +689,7 @@ public: ...@@ -689,7 +689,7 @@ public:
* care: the array must not be destroyed or reshaped for the duration of the returned object, * care: the array must not be destroyed or reshaped for the duration of the returned object,
* and the caller must take care not to access invalid dimensions or dimension indices. * and the caller must take care not to access invalid dimensions or dimension indices.
*/ */
template <typename T, ssize_t Dims = -1> detail::unchecked_mutable_reference<T, Dims> mutable_unchecked() { template <typename T, ssize_t Dims = -1> detail::unchecked_mutable_reference<T, Dims> mutable_unchecked() & {
if (Dims >= 0 && ndim() != Dims) if (Dims >= 0 && ndim() != Dims)
throw std::domain_error("array has incorrect number of dimensions: " + std::to_string(ndim()) + throw std::domain_error("array has incorrect number of dimensions: " + std::to_string(ndim()) +
"; expected " + std::to_string(Dims)); "; expected " + std::to_string(Dims));
...@@ -703,7 +703,7 @@ public: ...@@ -703,7 +703,7 @@ public:
* reshaped for the duration of the returned object, and the caller must take care not to access * reshaped for the duration of the returned object, and the caller must take care not to access
* invalid dimensions or dimension indices. * invalid dimensions or dimension indices.
*/ */
template <typename T, ssize_t Dims = -1> detail::unchecked_reference<T, Dims> unchecked() const { template <typename T, ssize_t Dims = -1> detail::unchecked_reference<T, Dims> unchecked() const & {
if (Dims >= 0 && ndim() != Dims) if (Dims >= 0 && ndim() != Dims)
throw std::domain_error("array has incorrect number of dimensions: " + std::to_string(ndim()) + throw std::domain_error("array has incorrect number of dimensions: " + std::to_string(ndim()) +
"; expected " + std::to_string(Dims)); "; expected " + std::to_string(Dims));
...@@ -876,7 +876,7 @@ public: ...@@ -876,7 +876,7 @@ public:
* care: the array must not be destroyed or reshaped for the duration of the returned object, * care: the array must not be destroyed or reshaped for the duration of the returned object,
* and the caller must take care not to access invalid dimensions or dimension indices. * and the caller must take care not to access invalid dimensions or dimension indices.
*/ */
template <ssize_t Dims = -1> detail::unchecked_mutable_reference<T, Dims> mutable_unchecked() { template <ssize_t Dims = -1> detail::unchecked_mutable_reference<T, Dims> mutable_unchecked() & {
return array::mutable_unchecked<T, Dims>(); return array::mutable_unchecked<T, Dims>();
} }
...@@ -887,7 +887,7 @@ public: ...@@ -887,7 +887,7 @@ public:
* for the duration of the returned object, and the caller must take care not to access invalid * for the duration of the returned object, and the caller must take care not to access invalid
* dimensions or dimension indices. * dimensions or dimension indices.
*/ */
template <ssize_t Dims = -1> detail::unchecked_reference<T, Dims> unchecked() const { template <ssize_t Dims = -1> detail::unchecked_reference<T, Dims> unchecked() const & {
return array::unchecked<T, Dims>(); return array::unchecked<T, Dims>();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment