是调用者还是被调用者复制或移动函数的返回值?例如,如果我想实现队列的pop()函数,就像这样
template <typename T>
class queue
{
std::deque<T> d;
public:
// ... //
T pop()
{
// Creates a variable whose destructor removes the first
// element of the queue if no exception is thrown.
auto guard = ScopeSuccessGuard( [=]{ d.pop_front(); } );
return d.front();
}
}
Run Code Online (Sandbox Code Playgroud)
是复制前面元素后调用的范围内容的析构函数?
编辑:后续问题:行
auto item = q.pop();
Run Code Online (Sandbox Code Playgroud)
现在是非常安全的吗?
我试着通过尝试
struct PropertyTest
{
@property int x() { return val; }
@property void x( int newVal ) { val = newVal; }
void test()
{
int j;
j = x;
x = 5;
}
private:
int val;
}
Run Code Online (Sandbox Code Playgroud)
当我离开时完全一样@property
.一切都很好.那么将函数声明@property
为什么意义呢?
顺便说一下,我正在使用dmd2编译器.
我需要一个既不可复制也不可移动的元素容器。这些元素不是默认可构造的,但它们的构造函数获得相同的参数。
容器的大小在其生命周期内不会改变。它应该像内置数组一样简单,但它的大小是在运行时调用构造函数时确定的。
有没有一种简单的方法来实现它而不会产生内存分配和使用引起的间接开销std::vector<std::unique_ptr<T>>
?
这编译:
[]{};
Run Code Online (Sandbox Code Playgroud)
这也是:
[]() mutable {};
Run Code Online (Sandbox Code Playgroud)
但是使用这段代码,编译器会向我抛出错误消息:
[] mutable {};
^~~~~~~
error: lambda requires '()' before 'mutable'
Run Code Online (Sandbox Code Playgroud)
有什么特别的理由吗?
显然,顺序一致的原子操作的有效可观察行为与有效C++程序中的仅获取释放操作不同.定义在C++标准(自C++ 11以来)或此处给出.
但是,我从来没有遇到过一个算法或数据结构的真实例子,其中获取 - 释放语义不足并且需要顺序一致性.
什么是真实世界算法或数据结构的实际例子,其中需要顺序一致性并且获取 - 释放内存顺序是不够的?
注意,即使std::mutex
不保证顺序一致性.
代码
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
Run Code Online (Sandbox Code Playgroud)
无法在第三行编译.为什么?我有什么优雅的替代品?
错误输出是Error: cannot append type const(char)* to type string
.
我有以下代码:
template <typename T>
void f1( T t )
{
std::cout << "f1( " << t << " ) called." << endl;
}
template <typename T>
void f2( T t )
{
std::cout << "f2( " << t << " ) called." << endl;
}
template <typename F, typename T>
void call( F && f, T t )
{
f( t );
}
template <typename T>
void foo( T t )
{
call( f1<T>, t ); // Why is <T> …
Run Code Online (Sandbox Code Playgroud) 我即将创建一个异常类层次结构,概念上看起来像这样:
#include <iostream>
#include <stdexcept>
class ExceptionBase : public std::runtime_error {
public:
ExceptionBase( const char * msg ) : std::runtime_error(msg) {}
};
class OperationFailure : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class FileDoesNotExistError : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class OperationFailedBecauseFileDoesNotExistError
: public OperationFailure, FileDoesNotExistError {
public:
using ExceptionBase::ExceptionBase; // does not compile
};
int main() {
OperationFailedBecauseFileDoesNotExistError e("Hello world!\n");
std::cout << e.what();
}
Run Code Online (Sandbox Code Playgroud)
所有构造函数应该与ExceptionBase
类的构造函数相同.派生的异常仅在类型上有所不同,否则没有添加的功能.上面代码中提到的最后一个异常类型也应该有这些构造函数.这是否可以使用C++ 11标准的继承构造函数功能?如果那是不可能的:还有什么选择?
(顺便说一句:在上面的代码中的类OperationFailure
和FileDoesNotExistError
.没有用gcc 4.8编译,但铿锵3.4显然,海湾合作委员会拒绝为虚拟基础继承构造函数这将是有趣的,知道谁在这里两种编译器拒绝了类OperationFailedBecauseFileDoesNotExistError …
阅读Herb Sutter关于最新C++标准会议的博客文章,它注意到std::byte
已添加到C++ 17中.作为初步阅读,我有一些担忧,因为它使用,unsigned char
以便它可以避免严格的混叠规则的复杂性.
我最关心的是,它如何在CHAR_BIT
不是8的平台上运行?我曾经在CHAR_BIT
16或32(通常是DSP)的平台上工作.鉴于这std::byte
是为了处理"面向字节的内存访问",并且大多数人理解字节以指示八位字节(不是基础字符类型的大小),对于期望这将解决连续的8-的个人来说,这将如何工作?有点大块的记忆?
我已经看到那些只假设CHAR_BIT
是8 岁的人(不知道CHAR_BIT
存在......).一种被称为std::byte
可能会给个人带来更多困惑的类型.
我想我所期望的是他们引入了一种类型,允许对所有情况进行一致的寻址/访问顺序八位字节.有许多面向八位字节的协议,无论CHAR_BIT
在给定平台上有什么相同,在所有平台上保证一次访问一个八位字节的库或类型是有用的.
我绝对可以理解,希望能够明确指出某些东西被用作字节序列而不是字符序列,但它看起来并不像许多其他东西那样有用.
我有一个使用外部库的程序.其中一个库(负责相机硬件)启动一个线程并且无法预测崩溃.有时每2分钟,有时不会持续一个小时.没有明显的触发因素.线程没有捕获异常,导致应用程序终止.:(
幸运的是,我可以在RaiseException()
函数引发异常时停止应用程序kernel32.dll
.调用堆栈上没有其他函数,我知道它们的用途.
调试器告诉我,这是一个std :: bad_alloc异常.调试器如何知道?我可以以某种方式获得有关异常的更多信息吗?如果有必要,我会查看反汇编,但我不知道从哪里获取信息.
我正在使用Visual Studio C++ 2010,熟悉汇编程序并对WINAPI有所了解.我们想尽快发布这个软件,这个bug必须消失.
c++ ×8
c++11 ×5
d ×2
arrays ×1
assembly ×1
atomic ×1
c++17 ×1
containers ×1
copying ×1
debugging ×1
exception ×1
lambda ×1
memory-model ×1
mutable ×1
noncopyable ×1
properties ×1
scopeguard ×1
string ×1
templates ×1