我是否可以在不安全修改的情况下在同一个表达式中多次使用该对象?
Can I use the object in the same expression more than once without modifying it safely?
我在 C++ primer 5 版上看过这个例子,它讨论了智能指针;我有 class StrBlobPtr
作为 StrBlob
.
的伴侣
StrBlobPtr
的成员之一是 deref
:
std::string& StrBlobPtr::deref() const
{
auto p = check(curr, "dereference past end");
return (*p)[curr]; // (*p) is the vector to which this object points
}
check
returns a std::shared_ptr
为 null 或指向一个对象。
我只想知道是否可以通过调用 check
直接生成 return 语句:
std::string& StrblobPtr::deref() {
return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_];
}
那么这里在同一个表达式中两次使用index_
而不修改它是否定义明确?谢谢!
在
中使用了两次index
return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_];
只要你不修改它就可以。
不过,您无条件地间接指向了指针,这是不对的。你说 check
可以 return 一个空指针。通过空指针间接访问是未定义的行为。您需要确保通过首先检查 return 值来防范这种情况。如果它为空,那么您要么需要 return 一个哨兵,要么抛出一个异常。
我在 C++ primer 5 版上看过这个例子,它讨论了智能指针;我有 class StrBlobPtr
作为 StrBlob
.
StrBlobPtr
的成员之一是 deref
:
std::string& StrBlobPtr::deref() const
{
auto p = check(curr, "dereference past end");
return (*p)[curr]; // (*p) is the vector to which this object points
}
check
returns a std::shared_ptr
为 null 或指向一个对象。
我只想知道是否可以通过调用
check
直接生成 return 语句:std::string& StrblobPtr::deref() { return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_]; }
那么这里在同一个表达式中两次使用
index_
而不修改它是否定义明确?谢谢!
在
中使用了两次index
return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_];
只要你不修改它就可以。
不过,您无条件地间接指向了指针,这是不对的。你说 check
可以 return 一个空指针。通过空指针间接访问是未定义的行为。您需要确保通过首先检查 return 值来防范这种情况。如果它为空,那么您要么需要 return 一个哨兵,要么抛出一个异常。