C++中有4个运算符可以重载但不能作为独立(即非成员,独立)函数重载.这些运营商是:
operator =
operator ()
operator ->
operator []
这个主题完全解释了禁止operator =
成为非成员函数的理由.关于其他三个的任何想法?
我们经常需要像这样的循环
do
{
Type value(GetCurrentValue());
Process(value);
}while(condition(value));
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不会编译,因为value
范围结束于}
.这意味着我必须在循环之外声明它.
Type value;
do
{
value = GetCurrentValue();
Process(value);
}while(condition(value));
Run Code Online (Sandbox Code Playgroud)
至少有两个原因,我不喜欢这个.首先,我喜欢在当地宣布事物.第二,如果值不可赋值或默认可构造,则这是一个问题,但只能复制构造.
所以,我的问题有两个方面.首先,我想知道将do while的范围扩展到最终条件是否有特定的原因/困难(正如for循环中声明的变量的范围包括for循环的主体,尽管它实际上是在牙箍之外).如果你相信我的第一个问题的答案是"这就是它的方式.不要问为什么问题." 然后我想知道是否有成语可以帮助编写类似于我的例子中的do-while循环,但没有我提到的缺点.
希望问题清楚.
当我使用DotNet1.1时,我遇到了C#的这个问题
问题是这个.我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数).当我在C#代码中声明DLLImport时,我传递了一个委托.但是C#中的委托具有stdcall
调用约定,而非托管函数需要cdecl
函数指针.因此,我天真的做法导致了崩溃.然后我找到了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking.事情进展顺利,直到......
我迁移到VS2008和新版本的.NET.在此版本下,上述库不起作用.我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(虽然它是开源的),所以我甚至不想尝试将它适应新的.NET.但是,我希望更新版本的C#可以为我的问题提供更好的解决方案.
那么,SO专家,请帮我解决臀部疼痛:)
在/ prog /上找到了这个.我实际上是GDB它,是的,它确实是一个递归.但它是如何发生的?
// This works on 32-bit x86 Linux with gcc as long as you don't enable optimization.
#include <stdio.h>
#include <stdlib.h>
static void factorial(int in, int *out)
{
*(&in-1)-=5-5*(1/in);
*out*=in--;
}
int main(int argc, char **argv)
{
int result=1;
int number=0;
if (argc!=2)
exit(1);
number=atoi(argv[1]);
if (number<1)
exit(2);
factorial(number, &result);
printf("%d! = %d\n", number, result);
return 0;
}
$ ./factorial 3
3! = 6
$ ./factorial 5
5! = 120
Run Code Online (Sandbox Code Playgroud) C++标准,主要在第5章,标题为表达式,定义哪些表达式是左值,哪些是右值.我读过那一章,我相信我可以正确区分左值和右值.
然而,在我阅读好的C++书籍和/或标准之前,我曾经认为左值是可以站在赋值左侧的东西,右值是不能的.显然,这个天真的定义有很多反例.一段时间后,我认为左值是一个有地址的东西,右值是没有的东西.这也似乎有一些反例,例如,一些临时物体,显然,它们确实有一个地址.
我的一个朋友问我什么是左值,什么是左值.我告诉他大概是什么,他要求一个更完整的答案.我告诉他去读标准.他拒绝骚扰他的大脑,并说他确信必须有一些必要和充分条件才能成为一个左右.
在那儿?
例如,左值是非const引用可以绑定的值.但这个并不令人满意.我正在寻找一些更明显的东西,这些东西很容易解释,而不需要考虑每种表达类型......
我希望这个问题很明确.
我在C++标准中读到的关于注入类名的内容与我将要提供的示例程序的行为相矛盾(我认为).这是我读到的:
从3.4(第3段)
为了名称隐藏和查找的目的,类的注入类名(第9节)也被认为是该类的成员.
从9(第2段)
在看到类名后立即将类名插入到作用域中.类名也插入到类本身的范围内; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.
从这些我了解到,以下是一个结构良好的翻译单元,它成功编译.
#include <vector>
class X: std::vector<int>
{
vector mem;
};
Run Code Online (Sandbox Code Playgroud)
但是,我认为以下应该产生错误,但事实并非如此
#include <vector>
class X: std::vector<int>, std::vector<char>
{
vector mem; //compiles OK... mem is apparently std::vector<int>
};
Run Code Online (Sandbox Code Playgroud)
由于名称vector
被注入到两个std::vector<int>
并std::vector<char>
作为仿佛公共成员名称,那么就应该通过X继承,因此,名称vector
中X
应该是明确的.我错过了什么吗?
PS我正在使用MSVC9.0
我总是std::string
通过size()
成员函数检索一个长度.说实话,我从来不知道有length()
会员功能.好吧,我刚才知道有.所以我想知道两者之间是否存在任何差异,并且在可能出现否定答案的情况下,为什么会有两个成员函数完全相同?
我有一个N个数字的数组是相同的.我正在应用快速排序.在这种情况下,排序的时间复杂度应该是多少.
我瞥了一眼这个问题,但没有得到确切的解释.
任何帮助,将不胜感激.
首先,我想向大家保证,我出于好奇而问这个问题.我的意思是,不要告诉我,如果我需要这个,那么我的设计有问题,因为我不需要在实际代码中.希望我说服你:)现在问题:
对于大多数类型T我们可以写
T* p = new T;
Run Code Online (Sandbox Code Playgroud)
现在如果T是数组类型怎么办?
int (*p)[3] = new ???; //pointer to array of 3 = new ???
Run Code Online (Sandbox Code Playgroud)
我试过这个:
typedef int arr[3];
arr* p = new arr;
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
是否有任何有效的语法或在C++中是不可能的.如果不可能,为什么呢?谢谢
编辑:我猜我不够清楚.我希望能够在这种情况下使用它:
void f(int(&)[3]);
int (*p)[3] = new ???;
f(*p);
Run Code Online (Sandbox Code Playgroud) 我想尽可能地用标准C++中的等价物替换外部库(如boost),如果它们存在且可能,最小化依赖性,因此我想知道是否存在转换boost::system::error_code
为安全的方法std::error_code
.伪代码示例:
void func(const std::error_code & err)
{
if(err) {
//error
} else {
//success
}
}
boost::system::error_code boost_err = foo(); //foo() returns a boost::system::error_code
std::error_code std_err = magic_code_here; //convert boost_err to std::error_code here
func(std_err);
Run Code Online (Sandbox Code Playgroud)
最重要的不是完全相同的错误,只是尽可能接近,最后如果是错误.有智能解决方案吗?
提前致谢!