小编Sup*_*mum的帖子

与在GCC中使用声明编译相同范围内的类声明但不在MSVS中编译

以下程序是否符合c ++标准?

namespace X { class A; }

namespace Y { using X::A; class A {}; }

int main() {}
Run Code Online (Sandbox Code Playgroud)

我用不同的编译器得到了不同的结果:

  • gcc编译它没有错误.
  • visual c ++给出错误C2888:'X :: A':符号不能在命名空间'Y'中定义

我没有在我的程序违反的c ++标准中找到任何规则.

如果程序格式正确,为什么visual studio会出错?

如果程序格式不正确,那么c ++标准中的规则是否会违反,为什么gcc不会出错?

我不是想让我的程序编译.我只是想根据c ++标准找出它是否格式正确,以及为什么我测试的两个编译器表现不同.

c++ declaration using-declaration language-lawyer

5
推荐指数
1
解决办法
1063
查看次数

具有多重继承和具有与原始声明不同的访问说明符的 using 声明的程序的实现分歧

根据 C++ 标准,以下程序的格式正确还是错误?

struct A { protected: static const int x = 0; };
struct B : A {};
struct C : A { using A::x; };
struct D : B, C {};

int main() { D::x; }
Run Code Online (Sandbox Code Playgroud)

不同的编译器给出不同的结果。Clang 拒绝它,GCC 接受它:

我认为该程序格式良好(因此 clang 存在拒绝它的错误),http://eel.is/c++draft/class.paths#1,但我不确定:

如果一个名称可以通过多重继承图的多个路径到达,则访问权是提供最多访问权的路径的访问权。

c++ multiple-inheritance using-declaration language-lawyer name-lookup

5
推荐指数
0
解决办法
290
查看次数

生命周期参数和借用如何在函数签名中交互

假设我在 Rust 中有一个具有以下签名的函数:

fn f<'a>(x: &'a i32) -> &'a i32;
Run Code Online (Sandbox Code Playgroud)

假设我执行以下操作:

let x = 0;
let y = f(&x);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Rust 借用检查器会考虑y借用x. 为什么?比“因为您在参数类型和返回类型中使用了相同的生命周期参数”更深层次的原因是什么?

rust

3
推荐指数
1
解决办法
152
查看次数

本身未实例化的函数中的错误实例。clang 和 gcc 之间的行为差​​异

考虑以下 C++ 程序:

template<typename X>
struct S
{
    X x;
};

template<typename>
void f()
{
    S<void> s;
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

当使用“-std=c++17 -pedantic-errors”编译时,它会给出clang的编译错误,但不会给出gcc的编译错误。

C++ 标准对这个程序有什么看法?是否有效?如果它无效,它是否具有未定义的行为?

如果回答这个问题的人可以继续并在他们的答案中包含 C++ 标准的相关部分,那就太好了。

用于尝试此操作的编译器资源管理器链接:https : //godbolt.org/z/Ke1K7b

c++ templates language-lawyer

1
推荐指数
1
解决办法
76
查看次数

方法定义中的变量名必须与C++中的声明名相同吗?

现在,我并不是说我认为这可以接近正确的编码实践(假设它甚至可能); 这个问题源于凌晨2点的错误:假设类定义类似于以下内容:

class myClass
{
public:
    void myMethod(const int & name);
}
Run Code Online (Sandbox Code Playgroud)

和定义:

void myClass::myMethod(const int & altName)
{
    //manipulate altName
}
Run Code Online (Sandbox Code Playgroud)

请注意,声明和定义的参数都是const int&类型,唯一的区别是变量名称.我知道这不会(在Visual Studio 2012中)抛出编译器错误或警告,但是在运行程序时是否会导致错误?

谢谢!

c++ class declaration definition language-lawyer

0
推荐指数
1
解决办法
71
查看次数