标签: c++

为什么临时取rvalue的地址是违法的?

根据" 如何绕过警告"rvalue用作左值"? ",Visual Studio只会警告代码如下:

int bar() {
   return 3;
}

void foo(int* ptr) {

}

int main() {
   foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)

在C++中,不允许获取临时(或者至少是由rvalue表达式引用的对象?)的地址,我认为这是因为临时保证甚至不能保存.

但是,虽然诊断程序可能以编译器选择的任何形式呈现,但我仍然期望MSVS 出错而不是在这种情况下发出警告.

那么,临时保证有储存吗?如果是这样,为什么上面的代码首先被禁止?

c++

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

为什么`operator <<`的`basic_ostream`的rvalue重载返回左值引用?

§27.7.3.9为以下内容定义以下重载operator<<:

template <class charT, class traits, class T>
  basic_ostream<charT, traits>&
  operator<<(basic_ostream<charT, traits>&& os, const T& x);
Run Code Online (Sandbox Code Playgroud)

效果: os << x
退货: os

(§27.7.2.6定义rvalue重载operator>>.)
基本上,它只是转发到左值超载.我认为这个重载非常危险(实际上istreamostream实际更重要),请考虑以下内容:

#include <sstream>
#include <iostream>

int main(){
  auto& s = (std::stringstream() << "hi there!\n");
  std::cout << s.rdbuf(); // oops
}
Run Code Online (Sandbox Code Playgroud)

关于Ideone的实例(未定义行为的完美示例.在MSVC10上没有为我打印).

上面的例子看起来做作,但它不应该太难进入这个情况在通用代码或传递时(std::stringstream() << "text"),以提供一个左值和一个右值过载和存储功能std::ostreamstd::istream以不同的方式根据过载.

现在,又将返回a basic_ostream<charT, traits>&&并指定以下内容的参数是什么?

返回: move(os)

(同样的basic_istream.)

有什么我可以忽略的吗?在目前的状态,在我看来,它看起来很危险,就像一个缺陷.我浏览了LWG问题列表并找到了这个提议(嗨@HowardHinnant!).它确实会返回一个右值,但是只为能够链这个特殊的运营商,而不是专门针对我上面描述的安全问题(尽管它肯定是额外的好处,确实 …

c++ iostream rvalue-reference c++11

24
推荐指数
1
解决办法
1284
查看次数

如何从C++程序执行命令行命令

如何在c ++中执行命令行"asterisk -rx"reload""?请帮忙.我需要一个例子.我正在使用ubuntu服务器,我想从用户(在webservice内)执行此命令行.

需要帮助欣赏

c++ ubuntu

24
推荐指数
2
解决办法
7万
查看次数

编译C++程序的阶段是什么?

是否由标准指定的C++程序的编译阶段?

如果是这样,他们是什么?

如果没有,广泛使用的编译器(我更喜欢MSVS)的答案会很棒.

我在谈论预处理,标记化,解析等.它们的执行顺序是什么,特别是它们的作用是什么?

编辑:我知道编译,链接和预处理是做什么的,我最感兴趣的是其他人和订单.当然,对这些的解释也受到欢迎,因为我可能不是唯一对答案感兴趣的人.

c++ compiler-construction compilation c++-faq

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

性能的C++模板?

我已经在网上看了几次,提到使用模板可以更快地使用C++.

有人可以解释,包括在低级别为什么这是确切的?我总是认为这样一个"好"的功能会像大多数有用的概念一样有开销.

从超低延迟的角度来看,我对此非常感兴趣!

c++ templates c++11

24
推荐指数
4
解决办法
8347
查看次数

如何查看Visual C++预处理器的输出?

我希望在我的代码上看到Visual C++预处理器的输出 - 即相当于gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何做到这一点?

c++ visual-c++ c-preprocessor

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

如何检查程序是否从控制台运行?

我正在编写一个将一些诊断转储到标准输出的应用程序.

我想让应用程序以这种方式工作:

  • 如果它是从独立命令提示符(通过cmd.exe)运行或将标准输出重定向/管道传输到文件,请在完成后立即退出,
  • 否则(如果它是从一个窗口运行并且控制台窗口是自动生成的),那么在窗口消失之前还要等待一个按键才能退出(让用户读取诊断信息)

我该如何区分?我怀疑检查父进程可能是一种方式,但我并没有真正进入WinAPI,因此问题.

我在MinGW海湾合作委员会.

c c++ winapi

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

使用CUDA和C++ 11时出错

我正在使用CUDA 4.1和GCC 4.5 ...(最终!CUDA支持GCC 4.5,但仍在等待GCC 4.6).无论如何,是否可以将C++ 11与CUDA 4.1一起使用?

我试过传递:

--compiler-options "-std=c++0x"
Run Code Online (Sandbox Code Playgroud)

到nvcc,它给我带来了一堆错误:

/usr/include/c++/4.5/exception_ptr.h(100): error: copy constructor for class "std::__exception_ptr::exception_ptr" may not have a parameter of type "std::__exception_ptr::exception_ptr"

/usr/include/c++/4.5/exception_ptr.h(100): error: expected a ")"

/usr/include/c++/4.5/exception_ptr.h(110): error: expected a ")"

/usr/include/c++/4.5/exception_ptr.h(132): error: identifier "type_info" is undefined

/usr/include/c++/4.5/exception_ptr.h(101): error: identifier "__o" is undefined

/usr/include/c++/4.5/exception_ptr.h(112): error: expected a ">"

/usr/include/c++/4.5/exception_ptr.h(112): error: identifier "__o" is undefined

/usr/include/c++/4.5/nested_exception.h(62): error: expected a ";"

/usr/include/c++/4.5/nested_exception.h(64): error: expected a ";"

/usr/include/c++/4.5/nested_exception.h(77): error: member function "std::nested_exception::~nested_exception" may not be redeclared outside …
Run Code Online (Sandbox Code Playgroud)

c++ gcc cuda c++11

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

boost :: none_t实现的基本原理是什么?

Boost.Optional使用虚拟类型来允许构建未初始化的实例boost::optional<T>.调用此类型none_t,none为方便起见,已在头中定义了一个实例,允许我们编写如下代码:

boost::optional<int> uninitialized(boost::none);
Run Code Online (Sandbox Code Playgroud)

看一下定义none_t,我注意到它实际上是一个typedef,对应于某个伪结构的指向成员的指针:

namespace boost {

namespace detail { struct none_helper{}; }

typedef int detail::none_helper::*none_t ;

none_t const none = (static_cast<none_t>(0)) ;

} // namespace boost
Run Code Online (Sandbox Code Playgroud)

使用这样一个复杂的typedef比这样的简单空结构有什么好处?

namespace boost {

struct none_t {};

none_t const none;

} // namespace boost
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-optional

24
推荐指数
1
解决办法
6160
查看次数

在函数内定义结构是否有任何"惩罚"?

只是出于好奇..

正如标题所说:在函数内定义结构是否存在任何"惩罚"?(如表现,记忆,糟糕的编程习惯等)


PS我知道,在函数内定义(非模板)仿函数是一种常见的做法,但仍然......)

c c++ struct function

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