标题:指向string的指针
只看楼主
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
void main()
{
    char ch1='1';
    char &ch2=ch1;            //编译通过 : char->char&
    const char&ch3=ch1;       //编译通过 : char->const char&
    const char ch4='4';   
    char &ch5=ch4;            //编译不通过 : const char!->char&
    const char&ch6=ch4;       //编译通过   : const char->const char&
    char &ch="hello"[0];      //编译不通过 : const char!->char&
    const char &ch="hello"[0];//编译通过   : const char->const char&
}
这样可以做为证据吗?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-23 11:11
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 

脱离编译环境来讨论这个问题我不知道有什么意义


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-23 11:16
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
得分:0 
char & ch1 = "hello"[0];
const char & ch2 = "hello"[0];
-----------------------------------------------

很有趣的兩個引用
可惜這兩個在 VC6.0 編譯器都通過了,

不過值得安慰的是, VS2005 更正了, 也就是不能通過了


原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2006-08-23 11:23
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
哦,我用的是2003

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-23 11:25
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-23 20:27
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-23 20:30
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
语言的规则与编译器规则是两码事。

当我们不知道何为错,何为对时。只有一根救命草来拯救我们~!那是什么才能对我们有说服力呢?我相信恐怕只有用编译器来回答我们自己的问题,现在编译器对这个问题有了出路,那又拿什么拯救我们呢?

期待ing...

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-23 20:44
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
得分:0 

char & ch = "Hello"[0];
----------------------------------
在 VS2005 中的報錯信息是:
error C2440 : cannot convert from 'const char' to 'char &'


爲此我看了一下 MSDN 中對於 C2440 的解析:

错误消息
“conversion”: 无法从 “type1”转换到“type2”


编译器无法从“type1”强制转换到“type2”。

标准 C++ 库中执行的一致性和更新工作可能导致 C2440。有关更多信息,请参见标准 C++ 库更改:Visual C++ .NET 2003 和 Visual C++ 版本中的库更改。

示例
如果试图将指向成员的指针转换为 void*,可能导致 C2440。下面的示例生成 C2440。

复制代码
// C2440.cpp
class B {
public:
void f(){;}

typedef void (B::*pf)();

void f2(pf pf) {
(this->*pf)();
void* pp = (void*)pf; // C2440
}

void f3() {
f2(f);
}
};

下一个示例的 15 和 16 行上的 C2440 错误将用 Incompatible calling conventions for UDT return value 消息限定。(UDT 指用户定义的类型,如类、结构或联合。)在前向声明的返回类型中指定的 UDT 调用约定与该 UDT 的实际调用约定有冲突并且涉及函数指针时,会导致上述类型的不兼容性错误。

在该示例中,我们首先拥有某结构和返回该结构的函数的前向声明;编译器假定该结构使用 C++ 调用约定。然后我们生成该结构的定义,默认情况下,该结构定义使用 C 调用约定。因为编译器在读完整个结构前,不知道该结构的调用约定,所以也假定在 get_c2 的返回类型中该结构的调用约定为 C++。

该结构后面跟有另一个返回该结构的函数声明,但在此时,编译器知道该结构的调用约定为 C++。同样,返回该结构的函数指针在结构定义之后定义,所以编译器知道该结构使用 C++ 调用约定。

若要解决由于不兼容的调用约定而产生的 C2440,请在 UDT 定义之后声明返回 UDT 的函数。

复制代码
// C2440b.cpp
struct MyStruct;

MyStruct get_c1();

struct MyStruct {
int i;
static MyStruct get_C2();
};

MyStruct get_C3();

typedef MyStruct (*FC)();

FC fc1 = &get_c1; // C2440, line 15
FC fc2 = &MyStruct::get_C2; // C2440, line 16
FC fc3 = &get_C3;

class CMyClass {
public:
explicit CMyClass( int iBar)
throw() {
}

static CMyClass get_c2();
};

int main() {
CMyClass myclass = 2; // C2440
// try one of the following
// CMyClass myclass(2);
// CMyClass myclass = (CMyClass)2;

int *i;
float j;
j = (float)i; // C2440, cannot cast from pointer to int to float
}

如果将零分配给内部指针,也可能出现 C2440:

复制代码
// C2440c.cpp
// compile with: /clr
int main() {
array<int>^ arr = gcnew array<int>(100);
interior_ptr<int> ipi = &arr[0];
ipi = 0; // C2440
ipi = nullptr; // OK
}

不正确地使用用户定义的转换也可能出现 C2440。有关用户定义的转换的更多信息,请参见 User-Defined Conversions。下面的示例生成 C2440。

复制代码
// C2440d.cpp
// compile with: /clr
value struct MyDouble {
double d;
// convert MyDouble to Int32
static explicit operator System::Int32 ( MyDouble val ) {
return (int)val.d;
}
};

int main() {
MyDouble d;
int i;
i = d; // C2440
// Uncomment the following line to resolve.
// i = static_cast<int>(d);
}

如果试图创建 Visual C++ 数组的实例,该数组的类型为 Array,也会出现 C2440。有关更多信息,请参见 array。下面的示例生成 C2440。

复制代码
// C2440e.cpp
// compile with: /clr
using namespace System;
int main() {
array<int>^ intArray = Array::CreateInstance(__typeof(int), 1); // C2440
// try the following line instead
// array<int>^ intArray = safe_cast<array<int> ^>(Array::CreateInstance(__typeof(int), 1));
}

属性功能中的更改也会导致 C2440。下面的示例生成 C2440。

复制代码
// c2440f.cpp
// compile with: /LD
[ module(name="PropDemoLib", version=1.0) ]; // C2440
// try the following line instead
// [ module(name="PropDemoLib", version="1.0") ];

生成此错误的原因还可能是为 Visual C++ 2005 执行的编译器一致性工作:对使用 /clr 编程的源代码进行编译时,Visual C++ 编译器不再允许 const_cast Operator 向下的强制转换。

要解决此 C2440,请使用正确的强制转换运算符(有关更多信息,请参见 Casting Operators)。有关更多信息,请参见 Breaking Changes in the Visual C++ 2005 Compiler。

下面的示例生成 C2440。

复制代码
// c2440g.cpp
// compile with: /clr
ref class Base {};
ref class Derived : public Base {};
int main() {
Derived ^d = gcnew Derived;
Base ^b = d;
d = const_cast<Derived^>(b); // C2440
d = dynamic_cast<Derived^>(b); // OK
}

使用 /clr:oldSyntax 也会生成 C2440。下面的示例生成 C2440。

复制代码
// c2440h.cpp
// compile with: /clr:oldSyntax
__gc class Base {};
__gc class Derived : public Base {};
int main() {
Derived *d = new Derived;
Base *b = d;
d = const_cast<Derived*>(b); // C2440
d = dynamic_cast<Derived*>(b); // OK
}

要提出有关“帮助”或本产品其他功能的建议或错误报告,请转到反馈站点。


原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2006-08-23 21:32
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
const char *const ch  ="hello";

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-08-24 11:20
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-25 15:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-85325-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068887 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved