标签: temporary

为什么临时的寿命不会延长到封闭物体的寿命?

我知道临时不能绑定到非const引用,但它可以绑定到const引用.那是,

 A & x = A(); //error
 const A & y = A(); //ok
Run Code Online (Sandbox Code Playgroud)

我也知道在第二种情况(上图)中,临时创建A()的生命周期延长到const引用的生命周期(即y).

但我的问题是:

可以将绑定到临时的const引用进一步绑定到另一个const引用,将临时的生命周期延长到第二个对象的生命周期吗?

我尝试过这个并没有用.我不太明白这一点.我写了这段代码:

struct A
{
   A()  { std::cout << " A()" << std::endl; }
   ~A() { std::cout << "~A()" << std::endl; }
};

struct B
{
   const A & a;
   B(const A & a) : a(a) { std::cout << " B()" << std::endl; }
   ~B() { std::cout << "~B()" << std::endl; }
};

int …
Run Code Online (Sandbox Code Playgroud)

c++ temporary

31
推荐指数
3
解决办法
3529
查看次数

返回没有副本的c ++ std :: vector?

是否可以从函数返回标准容器而无需复制?

示例代码:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();
Run Code Online (Sandbox Code Playgroud)

据我所知,这会将返回值复制到一个新的向量b中.使函数返回引用或类似的东西可以避免复制吗?

c++ stl copy temporary return-value

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

禁止创建临时对象

在多线程应用程序中调试崩溃时,我终于在此语句中找到了问题:

CSingleLock(&m_criticalSection, TRUE);
Run Code Online (Sandbox Code Playgroud)

请注意,它正在创建一个CSingleLock类的未命名对象,因此在此语句之后,临界区对象会立即解锁.这显然不是编码员想要的.此错误是由简单的输入错误引起的.我的问题是,有些我可以防止在编译时自己创建类的临时对象,即上面的代码类型应该生成编译器错误.一般来说,我认为每当一个类尝试进行某种资源获取时,就不应该允许该类的临时对象.有没有办法强制执行呢?

c++ mfc temporary

26
推荐指数
2
解决办法
2419
查看次数

关于将const引用绑定到临时的子对象

用代码就好

#include <iostream>

struct P {
    int x;
    P(int x) : x(x) {}
    ~P() { std::cout << "~P()\n"; }
};

int main() {
    auto const& x = P{10}.x;
    std::cout << "extract\n";
}
Run Code Online (Sandbox Code Playgroud)

GCC打印~P() extract,表示临时的生命周期未被引用扩展.

相比之下,Clang(IMO正确)将临时的生命周期延长到引用的生命周期,x因此析构函数将在输出调用main.

请注意,如果我们int使用某种类型(例如string),GCC会突然显示Clang的行为.

这是GCC中的错误还是标准允许的内容?

c++ reference temporary object-lifetime language-lawyer

24
推荐指数
3
解决办法
1203
查看次数

从SQL Server中的临时表创建临时视图

我有一个临时表,我想在这个临时表上创建一个临时视图.

可能吗?

在下面的例子中,我希望#Top10Records成为一个视图,而不是一个表,以便我得到

select * into #Top10Records from (select top 10 * from #MytempTable)
Run Code Online (Sandbox Code Playgroud)

sql-server view temporary

23
推荐指数
2
解决办法
4万
查看次数

工厂:如何将临时智能指针传递给函数.C++

我有一堂课Foo

class Foo;
Run Code Online (Sandbox Code Playgroud)

工厂返回指针:

std::unique_ptr<Foo> createFoo(); 
Run Code Online (Sandbox Code Playgroud)

因为Herb告诉我,在Foo的一生中没有特别要求的普通函数应该采用简单的指针:

void plainf(Foo* f);
Run Code Online (Sandbox Code Playgroud)

我的客户应该如何正确地做到这一点?

plainF(createFoo());
Run Code Online (Sandbox Code Playgroud)

如果他不得不写,他会不高兴:

auto someName = createFoo();
plainF(someName.get()); 
Run Code Online (Sandbox Code Playgroud)

c++ factory smart-pointers temporary

23
推荐指数
2
解决办法
2011
查看次数

"T const&t = C().a;" 延长"a"的寿命?

给出以下场景,将其解释为C++ 0x代码:

struct B { }; 
struct A { B b; }; 
int main() { 
  B const& b = A().b; 
  /* is the object still alive here? */
}
Run Code Online (Sandbox Code Playgroud)

Clang和GCC(截至2011/02的行李箱版本)表现不同:Clang延长了使用寿命.GCC移动B到新的临时对象,然后将引用绑定到该新临时对象.

我找不到任何一种行为都可以从标准的词汇中得出.表达式A().b不是暂时的(见5.2.5).有人可以向我解释以下内容吗?

  • 期望的行为(委员会的意图)
  • 您从FDIS中获取的行为

谢谢!

c++ temporary dot-operator c++11

20
推荐指数
1
解决办法
486
查看次数

在git中进行"临时"提交的最佳方法是什么?

假设我有一个带有两个分支master和dev的项目.我在dev上提交了一系列特殊事件的提交,这些特殊事件曾经测试过并合并到master中.然后在事件结束后我想删除特定于事件的代码.但是,由于添加了事件代码后已经进行了其他提交,因此无法执行git重置.

目前我使用git checkout来检查合并事件之前的文件,然后使用git diff重新添加自事件提交以来所做的更改.这对我来说似乎是一个非常混乱的方法.

有没有人有更好的解决方案在项目中使用临时代码?

编辑:要清楚,需要提交,推送,未提交,推送更改.

git temporary

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

当子表达式创建数组时,其中的临时数会发生什么?

我正在阅读FDIS的这两段(12.2p {4,5}):

有两种情况,临时表在与完整表达结束时不同的地方被摧毁.第一个上下文是调用默认构造函数来初始化数组的元素.如果构造函数具有一个或多个默认参数,则在构造下一个数组元素(如果有)之前,对默认参数中创建的每个临时的销毁进行排序.

第二个上下文是引用绑定到临时的.引用绑定的临时值或作为绑定引用的子对象的完整对象的临时值在引用的生命周期内持续存在,除了:[...]

  • 函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.

这两个似乎与以下案例相矛盾

struct A {
  A() { std::cout << "C" << std::endl; }
  ~A() { std::cout << "D" << std::endl; }
};

struct B {
  B(A const& a = A()) { }
};

typedef B array[2];

int main() {
  array{};
}
Run Code Online (Sandbox Code Playgroud)

这个输出是否会CDCD按照第一个上下文的要求输出,还是CCDD按照第二个上下文的要求输出?GCC似乎遵循第二个上下文描述和输出CCDD.我忽略了一些重要的事情吗?


编辑:我不认为它需要C++ 0x.new我的问题也影响了这个表达式:

new array(); /* CDCD or CCDD ?? */
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,GCC遵循第一个上下文和输出CDCD.

c++ standards temporary lifetime c++11

18
推荐指数
1
解决办法
363
查看次数

将临时绑定到非const引用

合理

我会尽量避免在C++代码分配完全.也就是说,我只使用初始化并const尽可能地声明局部变量(即总是除了循环变量或累加器之外).

现在,我发现了一个不起作用的情况.我认为这是一般模式,但特别是在以下情况下出现:

问题描述

假设我有一个程序将输入文件的内容加载到字符串中.您可以通过提供文件名(tool filename)或使用标准输入流(cat filename | tool)来调用该工具.现在,我如何初始化字符串?

以下不起作用:

bool const use_stdin = argc == 1;
std::string const input = slurp(use_stdin ? static_cast<std::istream&>(std::cin)
                                          : std::ifstream(argv[1]));
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?因为原型slurp需要看起来如下:

std::string slurp(std::istream&);
Run Code Online (Sandbox Code Playgroud)

也就是说,我的论证是非 - const因此我不能将它绑定到临时的.似乎没有办法使用单独的变量.

丑陋的解决方法

目前,我使用以下解决方案:

std::string input;
if (use_stdin)
    input = slurp(std::cin);
else {
    std::ifstream in(argv[1]);
    input = slurp(in);
}
Run Code Online (Sandbox Code Playgroud)

但这是以错误的方式揉搓我.首先,它是更多的代码(在SLOC中),但它也使用一个if而不是(这里)更逻辑的条件表达式,并且它在声明后使用我想要避免的赋值.

是否有一种避免这种间接初始化方式的好方法?这个问题可能会推广到需要改变临时对象的所有情况.难道流不是设计得不好以应对这种情况(const流没有意义,但是在临时流上工作确实有意义)?

c++ const temporary

16
推荐指数
2
解决办法
1393
查看次数