在 C++ 中通过引用选项传递
Passing by reference options in C++
我想通过引用(在广义上,即通过 A& 或通过 A*)将 Class A 的对象(称之为 a)传递给另一个 Class 的构造函数B. 我不希望 'a' 在 B 中被修改('a' 是只读的,它的大小很大,这就是我想通过引用传递它的原因)。我知道两个选项:
1) 将 'a' 作为
const A & a_
2) 将 'a' 作为
const A * a_
选项 1 的缺点是我可能会错误地传递 r 值。选项2的缺点是我可能会错误地传递一个空指针。
我的问题是:
1)我对上述缺点是否正确?
2) 是否有另一种推荐的通过引用传递 'a' 的方法?
我在下面的 link 中看到了答案。但是我很好奇是否还有其他选项而不是该问题中发布的选项。
Are there benefits of passing by pointer over passing by reference in C++?
看看 std::reference_wrapper
的构造函数:http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/reference_wrapper
它有一个额外删除的构造函数,该构造函数采用右值引用,因此如果您尝试将右值传递给它,该构造函数将赢得重载决议并且您会收到错误。
您可以做同样的事情:声明 const A&
和 A&&
构造函数,然后删除后者。那么没有人能够传入右值。
路过const A &
。
您可以通过声明该函数的右值重载来防止意外传递右值 = delete
。例如:
struct A { };
void func(const A & a) { }
void func(A && a) = delete;
int main()
{
A a;
func(a); // compiles
func(A()); // doesn't compile
}
代码:
#include <iostream>
using namespace std;
struct A
{ };
int func_one(A& var) {
A * insertVal=new A;
if (&var==nullptr)
return 0;
else
return 1;
}
int main() {
A refVar;
int x;
x=func_one(refVar);
return 1;
}
我想通过引用(在广义上,即通过 A& 或通过 A*)将 Class A 的对象(称之为 a)传递给另一个 Class 的构造函数B. 我不希望 'a' 在 B 中被修改('a' 是只读的,它的大小很大,这就是我想通过引用传递它的原因)。我知道两个选项:
1) 将 'a' 作为
const A & a_
2) 将 'a' 作为
const A * a_
选项 1 的缺点是我可能会错误地传递 r 值。选项2的缺点是我可能会错误地传递一个空指针。
我的问题是: 1)我对上述缺点是否正确? 2) 是否有另一种推荐的通过引用传递 'a' 的方法?
我在下面的 link 中看到了答案。但是我很好奇是否还有其他选项而不是该问题中发布的选项。 Are there benefits of passing by pointer over passing by reference in C++?
看看 std::reference_wrapper
的构造函数:http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/reference_wrapper
它有一个额外删除的构造函数,该构造函数采用右值引用,因此如果您尝试将右值传递给它,该构造函数将赢得重载决议并且您会收到错误。
您可以做同样的事情:声明 const A&
和 A&&
构造函数,然后删除后者。那么没有人能够传入右值。
路过const A &
。
您可以通过声明该函数的右值重载来防止意外传递右值 = delete
。例如:
struct A { };
void func(const A & a) { }
void func(A && a) = delete;
int main()
{
A a;
func(a); // compiles
func(A()); // doesn't compile
}
代码:
#include <iostream>
using namespace std;
struct A
{ };
int func_one(A& var) {
A * insertVal=new A;
if (&var==nullptr)
return 0;
else
return 1;
}
int main() {
A refVar;
int x;
x=func_one(refVar);
return 1;
}