'const foo**' 和 'foo** const' 是相同的吗?

3

我知道对于类型foo,函数bar的声明应该是这样的:

void bar(const foo*) and void bar(foo* const)

这两者是相同的。但是什么是双重间接?也就是说,

void bar(const foo**) and void bar(foo** const)

这两件事情是否相同?如果不是,那么我需要怎么做才能将 const 放在 void bar(foo** const) 的前面?


在第二种情况下,它们是不同的。const foo ** 是指向常量 foo 的指针的指针,而 foo ** const 是指向非常量 foo 的指针的常量指针。另一方面,const foo * 是指向常量 foo 的指针,而 foo * const 是指向非常量 foo 的常量指针。 - Jason
@AnoopRana:抱歉,但我在第一个中打错了一个字。 - P45 Imminent
1
const foo *foo const * 是相同的,但两者都不同于 foo * const - franji1
这些 声明 是一样的: void bar(foo*);void bar(foo* const);const 不影响函数签名。 - Eljay
1个回答

3

案例1

在这里我们考虑

void bar(const foo*); #1
void bar(foo* const)  #2

#1中,我们有一个指向const foo的指针,而在#2中,我们有一个指向非常量foo的常量指针。
您可以使用std::is_same来确认它们不同:
std::cout << std::is_same<const foo*, foo* const>::value << ' ';   //false

案例2

这里我们考虑

void bar(const foo**); #3
void bar(foo** const); #4

在 #3 中,我们有一个指向指向 const foo 的指针,而在 #4 中,我们有一个指向非 const 指针的 const 指针,该指针指向一个非 const foo。
std::cout << std::is_same<const foo**, foo** const>::value << ' '; //false

此外,请注意const foo *foo const *相同,但在给出的示例中没有这种情况。
std::cout << std::is_same<const foo *, foo const *>::value << ' '; //true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接