std::begin和 new 和有什么不一样std::ranges::begin?(同样为end,size等等)
两者似乎工作相同:
#include <iostream>
#include <vector>
#include <array>
#include <ranges>
template<std::ranges::range R>
void printInfo(const R &range)
{
std::cout << (std::ranges::begin(range) == std::begin(range));
}
template<class T>
struct X
{
std::vector<T> v;
auto begin() const { return v.begin(); }
auto end() const { return v.end(); }
};
int main()
{
printInfo(std::vector{1, 2, 3, 4});
printInfo(std::array{1, 2, 3, 4});
printInfo(X<int>{{1, 2, 3, 4}});
int oldSchool[]{1, 2, 3, 4};
printInfo(oldSchool);
}
Run Code Online (Sandbox Code Playgroud)
1111按预期编译和打印。
难道ranges::begin …
我希望这个问题不超出SO的范围; 如果是(对不起那种情况),请告诉我它属于哪里,我会尝试将它移到那里.
用于C/C++中静态代码分析的SAL注释的概念对我来说似乎非常有用.以MSDNwmemcpy上错误实现的示例为例:了解SAL:
wchar_t * wmemcpy(
_Out_writes_all_(count) wchar_t *dest,
_In_reads_(count) const wchar_t *src,
size_t count)
{
size_t i;
for (i = 0; i <= count; i++) { // BUG: off-by-one error
dest[i] = src[i];
}
return dest;
}
Run Code Online (Sandbox Code Playgroud)
MSDN说"代码分析工具可以通过单独分析这个功能来捕获错误",这看起来很棒,但问题是,当我在VS 2017社区中粘贴此代码时,没有关于此代码分析的警告,甚至没有启用所有分析警告.(像其他警告C26481 Don't use pointer arithmetic. Use span instead (bounds.1)..)
这应该产生警告(至少根据另一个例子回答什么是SAL(来源标注语言)的目的是什么SAL 1和2之间的差异),但不会:
_Success_(return) bool GetASmallInt(_Out_range_(0, 10) int& an_int);
//main:
int result;
const auto ret = GetASmallInt(result);
std::cout << …Run Code Online (Sandbox Code Playgroud) 在我安装 VS 社区 16.5.0 预览版 2.0 之前,以下使用可为空引用的通用函数工作正常(在此之前我使用预览版 1.0,我使用的是 .NET Core 3.0/3.1):
static async Task<C> Test<C>(MyClass a, MyClass b, Func<MyClass, Task<C>> extract) where C : class? =>
await extract(a) ?? (b is {} ? await extract(b) : null);
static T MinOrDefault<T>(this IEnumerable<T> enumerable) =>
enumerable.Any() ? enumerable.Min() : default;
Run Code Online (Sandbox Code Playgroud)
但现在两者都给出错误CS8603 Possible null reference return.
有谁知道这种行为是否是故意的?有没有一个好的方法来解决这个问题?
当我在JavaScript中定义命名空间时,Netbeans给出了一个未声明错误的全局变量,而我认为它不应该.为什么是这样?
演示代码:
var MyNamespace = new function () {
var MyClass = function () {};
MyClass.SOME_CONSTANT = 9; // MyClass not defined
this.MyClass = MyClass; // MyClass not defined
};
Run Code Online (Sandbox Code Playgroud)
我检查了这个代码在IE(文档模式IE 5)和Edge 13中工作.代码是一个模块模式,就像在这个答案中的语法.
编辑:首先声明一个变量可能没用,因为命名空间内的函数有时会改变局部变量而不是公共命名空间中的变量,对不对?不过,我想知道为什么Netbeans会给我一个错误.
c++ ×4
c++20 ×3
iterator ×2
std-ranges ×2
c# ×1
c#-8.0 ×1
generics ×1
javascript ×1
namespaces ×1
netbeans ×1
range ×1
sal ×1
std-span ×1