我问的是关于c#,但我认为它在大多数其他语言中都是一样的.
有没有人对表达式和语句有一个很好的定义,有什么区别?
你看到它用于for循环语句,但它在任何地方都是合法的语法.您在其他地方找到了什么用途,如果有的话?
最近在回答问题时,我意识到只要表达式被包围,逗号运算符就被允许在C++ 11中的常量表达式中(),例如:
int a[ (1, 2) ] ;
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,禁止在常量表达式中使用逗号运算符,来自草案预C++ 11标准部分5.19 常量表达式(强调我的):
[...]特别是,除了sizeof表达式,不应使用函数,类对象,指针或引用,并且不得使用赋值,递增,递减,函数调用或逗号运算符.
为什么逗号运算符不允许在C++ 11之前的常量表达式中,为什么解除了这个限制?
我正在尝试检查仿函数是否与给定的一组参数类型和给定的返回类型兼容(也就是说,给定的参数类型可以被隐含地转换为实际的参数类型,反之亦然的是返回类型).目前我使用以下代码:
template<typename T, typename R, template<typename U, typename V> class Comparer>
struct check_type
{ enum {value = Comparer<T, R>::value}; };
template<typename T, typename Return, typename... Args>
struct is_functor_compatible
{
struct base: public T
{
using T::operator();
std::false_type operator()(...)const;
};
enum {value = check_type<decltype(std::declval<base>()(std::declval<Args>()...)), Return, std::is_convertible>::value};
};
Run Code Online (Sandbox Code Playgroud)
check_type<T, V, Comparer>
这在大多数情况下非常struct foo{ int operator()() const;};好用,但是当我测试无参数仿函数时,它无法编译,因为在这种情况下,两个operator()基数显然是暧昧的,导致类似这样的事情:
error: call of '(is_functor_compatible<foo, void>::base) ()' is ambiguous
note: candidates are:
note: std::false_type is_functor_compatible<T, Return, Args>::base::operator()(...) const [with T = foo, Return …Run Code Online (Sandbox Code Playgroud) 我对逗号运算符很困惑。我从来没有见过这样的语法这样的代码?但我很好奇它是否在任何地方有用?为什么它在 c++20 中被弃用?
#include <iostream>
int main()
{
int a[5]{1,2,3,45,5};
std::cout << a[(2,3)] <<'\n'; // this is work , in c++17 works
std::cout << a[2,3] << '\n'; // but this is deprecated in c++20 ,in c++17 works
return 0;
}
Run Code Online (Sandbox Code Playgroud)