根据" 如何绕过警告"rvalue用作左值"? ",Visual Studio只会警告代码如下:
int bar() {
return 3;
}
void foo(int* ptr) {
}
int main() {
foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)
在C++中,不允许获取临时(或者至少是由rvalue表达式引用的对象?)的地址,我认为这是因为临时保证甚至不能保存.
但是,虽然诊断程序可能以编译器选择的任何形式呈现,但我仍然期望MSVS 出错而不是在这种情况下发出警告.
那么,临时保证有储存吗?如果是这样,为什么上面的代码首先被禁止?
§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>>.)
基本上,它只是转发到左值超载.我认为这个重载非常危险(实际上istream比ostream实际更重要),请考虑以下内容:
#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::ostream或std::istream以不同的方式根据过载.
现在,又将返回a basic_ostream<charT, traits>&&并指定以下内容的参数是什么?
返回: move(os)
(同样的basic_istream.)
有什么我可以忽略的吗?在目前的状态,在我看来,它看起来很危险,就像一个缺陷.我浏览了LWG问题列表并找到了这个提议(嗨@HowardHinnant!).它确实会返回一个右值,但是只为能够链这个特殊的运营商,而不是专门针对我上面描述的安全问题(尽管它肯定是额外的好处,确实 …
如何在c ++中执行命令行"asterisk -rx"reload""?请帮忙.我需要一个例子.我正在使用ubuntu服务器,我想从用户(在webservice内)执行此命令行.
需要帮助欣赏
是否由标准指定的C++程序的编译阶段?
如果是这样,他们是什么?
如果没有,广泛使用的编译器(我更喜欢MSVS)的答案会很棒.
我在谈论预处理,标记化,解析等.它们的执行顺序是什么,特别是它们的作用是什么?
编辑:我知道编译,链接和预处理是做什么的,我最感兴趣的是其他人和订单.当然,对这些的解释也受到欢迎,因为我可能不是唯一对答案感兴趣的人.
我已经在网上看了几次,提到使用模板可以更快地使用C++.
有人可以解释,包括在低级别为什么这是确切的?我总是认为这样一个"好"的功能会像大多数有用的概念一样有开销.
从超低延迟的角度来看,我对此非常感兴趣!
我希望在我的代码上看到Visual C++预处理器的输出 - 即相当于gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何做到这一点?
我正在编写一个将一些诊断转储到标准输出的应用程序.
我想让应用程序以这种方式工作:
cmd.exe)运行或将标准输出重定向/管道传输到文件,请在完成后立即退出,我该如何区分?我怀疑检查父进程可能是一种方式,但我并没有真正进入WinAPI,因此问题.
我在MinGW海湾合作委员会.
我正在使用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) 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) 只是出于好奇..
正如标题所说:在函数内定义结构是否存在任何"惩罚"?(如表现,记忆,糟糕的编程习惯等)
PS我知道,在函数内定义(非模板)仿函数是一种常见的做法,但仍然......)