标签: reference-binding

使用placement new来更新引用成员?

以下代码在C++中是否合法?

template<typename T>
class Foo {
public:
    Foo(T& v) : v_(v) {}

private:
    T& v_;
};

int a = 10;
Foo<int> f(a);

void Bar(int& a) {
    new (&f)Foo<int>(a);
}
Run Code Online (Sandbox Code Playgroud)

引用不应该被绑定两次,对吧?

c++ reference placement-new object-lifetime reference-binding

3
推荐指数
1
解决办法
307
查看次数

从共享指针转换为指向const的共享指针

以下代码无法编译:

#include <iostream>
#include <memory>

class A
{
public:
    A( )
        : m_i( new int )
    { }

    std::shared_ptr< const int >&
    get( )
    {
        return m_i; // <-- invalid initialization of reference of type
                    //     'std::shared_ptr<const int>&' from 
                    //     expression of type 'std::shared_ptr<int>'
    }

private:
    std::shared_ptr< int > m_i;
};


int main( )
{
    A a;
    auto& i = a.get( );

    std::cout << *i << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何从共享指针转换为常量对象的共享指针?static_cast也失败了.

c++ const return-value shared-ptr reference-binding

3
推荐指数
2
解决办法
514
查看次数

使用 const 引用延长临时对象的寿命

我需要一些关于 const 引用的澄清。从这个链接

const Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

const 引用延长了本地对象的寿命。但是当我检查这个链接时,尽管他们使用了 const 引用

Sandbox(const string& n) : member(n) {}
Run Code Online (Sandbox Code Playgroud)

字符串“四”的寿命没有增加。

Sandbox sandbox(string("four"));
Run Code Online (Sandbox Code Playgroud)

他们用了这句话

只有本地常量引用才能延长寿命。

那么在第二个链接中,字符串“four”不是主函数的本地字符串吗?const 引用不应该n延长其寿命吗?
那么为什么第二个环节的寿命没有延长呢?

c++ pass-by-reference lifetime temporary-objects reference-binding

2
推荐指数
1
解决办法
1887
查看次数

最佳可行的转换功能

在以下程序中,应选择哪个(如果有)转换功能,为什么?

int r;
struct B {};
struct D : B {};
struct S {
  D d;
  operator D&(){r=1; return d;} // #1
  operator B&(){r=2; return d;} // #2
};
int main() {
  S s;
  B& b = s;
  return r;
}
Run Code Online (Sandbox Code Playgroud)

gcc和clang选择均选择转换功能#2。但为什么?

标准

(1)在[dcl.init.ref]中指定的条件下,可以将引用直接绑定到将转换函数应用于初始化程序表达式的结果。重载解析用于选择要调用的转换函数。假设“对cv1 T的引用”是要初始化的引用的类型,而“ cv S”是初始化程序表达式的类型,其中S为类类型,则按以下方式选择候选函数:

(1.1)-考虑S的转换函数及其基类。那些未隐藏在S中且产生类型“对cv2 T2的左值引用”(初始化对函数的左值引用或右值引用时)或“ cv2 T2”或“对cv2 T2的右值引用”的非显式转换函数将右值引用或左值引用初始化为函数),其中“ cv1 T”与“ cv2 T2”的引用兼容)是候选函数。对于直接初始化,未隐藏在S中的那些显式转换函数会产生类型“对cv2 T2的左值引用”(初始化对函数的左值引用或右值引用)或“对cv2 T2的右值引用”(当初始化对函数的右值引用或左值引用),

(2)参数列表有一个参数,它是初始化器表达式。[?注:此参数将与转换函数的隐式对象参数进行比较。-?尾注?]

这里我们有两个候选函数#1和#2。两者都可行-如果删除其中之一,程序仍会编译。这两个转换函数仅采用隐式参数,并且具有相同的cv和ref限定。因此,没有一个应该是最可行的,并且该程序也不应编译。为什么编译?

c++ language-lawyer overload-resolution implicit-conversion reference-binding

2
推荐指数
1
解决办法
82
查看次数

const 引用会延长临时对象返回的临时对象的寿命吗?

我知道 const 引用会延长本地临时文件的寿命。现在我问自己是否可以在临时对象链上扩展此属性,也就是说,我是否可以安全地定义:

std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
Run Code Online (Sandbox Code Playgroud)

我的感觉是,由于第一个方法aBar.getTemporaryObject1()已经返回了一个临时对象,因此不适用于aBar.getTemporaryObject2().

c++ lifetime rvalue temporary-objects reference-binding

0
推荐指数
1
解决办法
620
查看次数