标准是否有关于引用捕获的异常以及尝试修改它的情况有什么说法?
请考虑以下代码:
class my_exception: public std::logic_error
{
public:
std::vector<std::string> callstack;
};
void MyFunc()
{
try
{
SomethingThatThrows();
}
catch (my_exception & e)
{
e.callstack.push_back("MyFunc");
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子,我实际上并没有尝试这样的事情.我只是好奇会发生什么,基于另一个线程中的建议,异常应该被const引用捕获.
标准库中有一些函数,例如std::map::insert,返回一个std::pair.有时,将两个不同的变量填充对应于该对的一半将是方便的.有一个简单的方法吗?
std::map<int,int>::iterator it;
bool b;
magic(it, b) = mymap.insert(std::make_pair(42, 1));
Run Code Online (Sandbox Code Playgroud)
我在找magic这里.
该string模块包含一个whitespace属性,该属性是一个由所有被视为空格的ASCII字符组成的字符串.是否有相应的常量也包含Unicode空格,例如不间断空格(U + 00A0)?我们可以从问题" strip()和strip(string.whitespace)给出不同的结果 ",至少strip知道额外的Unicode空白字符.
这个问题被确定为
In Python[:space:]的副本,如何列出POSIX扩展正则表达式匹配的所有字符?,但该问题的答案确定了搜索空白字符以生成自己的列表的方法.这是一个耗时的过程.我的问题是关于一个常数.
什么是与Microsoft Visual C++ 6兼容的Boost库的最新版本?你能提供直接下载的链接吗?
http://www.boost.org上的 "下载"链接仅提供版本1.36.0的下载,该版本的文档列出了Visual C++ 7.1作为Microsoft编译器测试的最低版本.他们是否清除旧版本的下载?
我想要一个简单的函数,它接收一个字符串并在一些解析后返回一个字符串数组.所以,这是我的功能签名:
int parse(const char *foo, char **sep_foo, int *sep_foo_qty) {
int i;
char *token;
...
strcpy(sep_foo[i], token); /* sf here */
...
}
Run Code Online (Sandbox Code Playgroud)
然后我称之为:
char sep_foo[MAX_QTY][MAX_STRING_LENGTH];
char foo[MAX_STRING_LENGTH];
int sep_foo_qty, error;
...
error = parse(foo, sep_foo, &sep_foo_qyt);
...
Run Code Online (Sandbox Code Playgroud)
这样我在编译期间会收到警告:
warning: passing argument 2 of 'parse' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
然后在标记为/*sf的行中执行期间出现分段错误*/
我的C代码有什么问题?
提前致谢
以下是实际问题的简化版本.Base::operator=(int)代码似乎不是调用,而是生成临时Derived对象并复制它.为什么不使用基本赋值运算符,因为函数签名似乎完全匹配?这个简化的示例没有显示任何不良影响,但原始代码在析构函数中具有副作用,导致各种破坏.
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()\n";
}
Base(int)
{
cout << "Base(int)\n";
}
~Base()
{
cout << "~Base()\n";
}
Base& operator=(int)
{
cout << "Base::operator=(int)\n";
return *this;
}
};
class Derived : public Base
{
public:
Derived()
{
cout << "Derived()\n";
}
explicit Derived(int n) : Base(n)
{
cout << "Derived(int)\n";
}
~Derived()
{
cout << "~Derived()\n";
}
};
class Holder
{
public:
Holder(int n)
{
member …Run Code Online (Sandbox Code Playgroud) 在C++中,获取shell在Windows XP和Windows 7中称为"我的文档"的文件夹和Vista中的"文档"的文件夹的完整路径名并不太难; 请参阅获取我的文档的路径
有没有一种简单的方法在Python中执行此操作?
注意:我正在标记这个Python和C++,因为我已经看到了两者中的例子,但问题是语言无关.
修改对象的函数或类方法有两种选择:直接在相关对象中修改数据,或创建新副本并在保持原始状态不变的情况下返回它.通常,您可以通过查看函数返回的内容来判断哪个是哪个.
有时,您会找到一个尝试同时执行这两项操作的函数,修改原始对象,然后返回该对象的副本或引用.有没有一种情况比只做一个或另一个提供任何优势?
我已经看到了Fluent Interface或Method Chaining的例子,它依赖于返回对象的引用,但这似乎是一个在上下文中应该很明显的特殊情况.
我的第一个坏例子直接来自Python文档,并说明了可变默认参数的问题.对我来说,这个例子是不现实的:如果函数修改了它的参数,那么有一个默认值是没有意义的,如果它返回一个副本,那么应该在进行任何修改之前进行复制.这个问题只存在,因为它试图同时做到这两点.
def f(a, L=[]):
L.append(a)
return L
Run Code Online (Sandbox Code Playgroud)
第二个例子来自CStringT::MakeUpper函数中的Microsoft C++ .文档说明了返回值:
返回字符串的副本,但全部为大写字符.
这导致人们期望原件保持不变.问题的一部分是文档有误导性,如果你看原型,你会发现它正在返回对字符串的引用.除非仔细观察,否则您不会注意到这一点,并将结果分配给新字符串进行编译而没有错误.后来出人意料.
我试图在for循环中追踪一个神秘的迭代器问题.我在迭代器中得到一个错误,operator!=这通常意味着被比较的迭代器不属于同一个容器.跟踪Microsoft的库实现,operator!=调用operator==此测试的位置:
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("list iterators incompatible");
Run Code Online (Sandbox Code Playgroud)
为了获得更多信息,我写了这个小函数来替换我!=在for循环中:
template<typename iter>
bool bang_equal(const iter & left, const iter & right)
{
static int count = 0;
auto p1 = left._Getcont();
auto p2 = right._Getcont();
ATLTRACE("Iterator comparison left _Getcont()=%p right _Getcont()=%p %d\n", p1, p2, ++count);
MemoryBarrier(); …Run Code Online (Sandbox Code Playgroud) c++ ×6
python ×3
c ×2
visual-c++ ×2
arrays ×1
boost ×1
exception ×1
graphics ×1
mutable ×1
parameters ×1
pointers ×1
puzzle ×1
string ×1
unicode ×1
visual-c++-6 ×1
whitespace ×1
windows ×1