我来自 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++ 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,那为什么我应该使用约束呢?
新发布的草案在[expr.prim.req]/6 中提到:
如果将模板参数替换为需求总是会导致替换失败,则程序格式错误;无需诊断。[ 示例:
Run Code Online (Sandbox Code Playgroud)template<typename T> concept C = requires { new int[-(int)sizeof(T)]; // ill-formed, no diagnostic required };— 结束示例 ]
但是为什么我们不能保证诊断总是失败,而不是跳过诊断?
在 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 中那样的函数?
任何帮助表示赞赏。
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”,但不知怎的,它计算不正确?