小编Apl*_*Ddr的帖子

如何防止外部"C"函数的重载?

我正在编写一个c ++库,它公开了一些仅由C#代码使用的函数.但是,由于我意外地错误输入了参数,我发现只要我不在cpp文件中使用(没有错误的版本)函数,即使没有任何警告,也可以成功编译和链接此代码.

struct Dummy { int a; double b; };
extern "C" void SetArray(Dummy* x, int cnt);
void SetArray(Dummy x, int cnt)
{
    // a TODO placeholder.
}
Run Code Online (Sandbox Code Playgroud)

如何让编译器为这种情况抛出错误或警告?编译器选项-Wall已设置但仍然没有警告.使用tdmgcc 5.1.0.

c++ overloading compilation extern

16
推荐指数
2
解决办法
1331
查看次数

将 const 引用成员设置为临时变量是否安全?

我试过多次这样编码:

struct Foo
{
    double const& f;
    Foo(double const& fx) : f(fx)
    {
        printf("%f %f\n", fx, this->f); // 125 125
    }

    double GetF() const
    {
        return f;
    }
};
int main()
{
    Foo p(123.0 + 2.0);
    printf("%f\n", p.GetF()); // 0
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它根本不会崩溃。我还使用valgrind来测试程序,但没有出现错误或警告。所以,我假设编译器自动生成了一个代码,将引用指向另一个隐藏变量。但我真的不确定。

c++ reference constants temporary lifetime

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

如何检查两个引用变量是否借用了同一对象?

我有一个结构,所有存储只读引用,例如:

struct Pt { x : f32, y : f32, }
struct Tr<'a> { a : &'a Pt }
Run Code Online (Sandbox Code Playgroud)

我想impl Eq对于Tr测试,如果下伏a参考如出一辙Pt

let trBase1 = Pt::new(0.0, 0.0);
let trBase2 = Pt::new(0.0, 0.0);
assert!(trBase1 == trBase2);        // ok.
let tr1 = Tr::new(&trBase1);
let tr2 = Tr::new(&trBase2);
let tr3 = Tr::new(&trBase1);
assert!(tr1 == tr3);                // ok.
assert!(tr1.a == te2.a);            // ok. Using Eq for Pt that compare values.
assert!(tr1 != tr2);                // panicked! Not intended. …
Run Code Online (Sandbox Code Playgroud)

rust borrowing

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