小编Joh*_*ing的帖子

可以使用指针修改只读字段吗?但为什么?

我来自 C++,发现 C++ 和 C# 中的指针之间的行为非常不同。

我惊讶地发现这段代码可以编译......甚至......工作完美。

class C
{
    private readonly int x = 0;
    unsafe public void Edit()
    {
        fixed (int* p = &x)
        {
           *p = x + 1;
        }
        Console.WriteLine($"Value: {x}");
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,即使在 C++ 中我们也有保护const对象的机制(const在 C++ 中与readonly在 C# 中几乎相同,而不是const在 C# 中),因为我们没有足够的理由通过指针随意修改 const 值。

进一步探索,我发现在 C# 中没有等效于 C++ 的低级 const 指针,它类似于:

readonly int* p
Run Code Online (Sandbox Code Playgroud)

在 C# 中,如果有的话。

那么 p 只能读取指向的对象,不能写入。

对于const对象,C#禁止尝试检索其地址。

在 C++ …

c# c++ pointers readonly-attribute language-lawyer

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

关于约束和概念

我真的不明白为什么C++ 20提供这样的功能.我认为这是多余的,是的,我确定我错了,但我需要有人指出我错的原因以及如何优雅地使用这个功能.这是一个例子:

template<typename T>
concept LessCompareable=requires(const T& lhs, const T& rhs)
{
      {lhs<rhs}->bool;
};
Run Code Online (Sandbox Code Playgroud)

现在我已经定义了一个概念.然后我会像这样约束一个函数模板:(好吧,让我们把它命名为comp,实际上就像它一样std::min)

template<typename T>
const T& comp(const T& a , const T& b) requires LessCompareable<T>
{return a<b?a:b;}
Run Code Online (Sandbox Code Playgroud)

所以问题是如果你这样称呼它

std::thread a,b;
cout<<comp(a,b);
Run Code Online (Sandbox Code Playgroud)

complie错误发生

但如果我们不使用约束,CE也会发生.

所以这让我感到困惑,他们都有CE,那为什么我应该使用约束呢?

c++ c++20

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

为什么使用无效的概念被视为格式错误

新发布的草案在[expr.prim.req]/6 中提到:

如果将模板参数替换为需求总是会导致替换失败,则程序格式错误;无需诊断。[ 示例:

template<typename T> concept C =
requires {
  new int[-(int)sizeof(T)];     // ill-formed, no diagnostic required
};
Run Code Online (Sandbox Code Playgroud)

— 结束示例 ]

但是为什么我们不能保证诊断总是失败,而不是跳过诊断?

c++ templates require c++-concepts c++20

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

F# 的 C# 公共成员初始值设定项是否有任何替代方案?

在 C# 中,可以分配公共成员来代替构造函数调用:

options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "preferred_username" }
Run Code Online (Sandbox Code Playgroud)

为了达到同样的效果,我编写了以下 F# 代码:

options.TokenValidationParameters <- (new TokenValidationParameters()) |> fun it -> (it.NameClaimType <- "preferred_username"; it)
Run Code Online (Sandbox Code Playgroud)

然而它看起来一点也不好看。

有没有更好的方法来做到这一点?apply理想的解决方案可能是像kotlin 中那样的函数?

任何帮助表示赞赏。

f# c#-to-f#

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

C语言中int转Double的方法

int num1, num2;
Run Code Online (Sandbox Code Playgroud)

double average;

average=(double)(num1+num2)/2;
printf("average: %d", average);
Run Code Online (Sandbox Code Playgroud)

我的测试 printf 显示平均值为: 0

这可能太简单了,但我看不到。我的输入都是“int”,平均值是“double”,但不知怎的,它计算不正确?

c types casting operator-precedence

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