MSVC是否有类似于GCC的({})的模拟功能?

11

msvc是否有类似于gcc中的({})语法?

我认为答案是否定的。
请注意,这是关于编译器功能的问题,而不是关于品味或风格的问题。

并不是说我建议任何人开始使用({})语法,仅仅是想问一下它是否存在。

关于({})语法的参考资料可以在这里找到。它被正式称为“表达式中的语句和声明”,允许将语句(如for、goto)和声明嵌入到表达式中。


1
我可以请教一下这个构造函数的引用吗?谢谢! - xanatos
我赞同xanatos的意见。它是什么意思/作用? - 0xC0000022L
1
@xanatos,@STATUS_ACCESS_DENIED:它允许您拥有一组语句,这些语句评估为一个值。编写宏非常有用。这是从Lisp借来的一个想法,在其中__每个__语句组都是这样的。 - Omnifarious
你是指 vector<int> a({1, 2, 3}) 吗? - Johannes Schaub - litb
xanatos,Jonannes:它在官方上被称为 "Statements and Declarations in Expressions",网址为http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62。 它允许将语句(如for,goto)和声明嵌入表达式中。 - Andrei
2个回答

12

某种程度上是的。这是一个复合语句表达式,可以将其视为立即调用且仅调用一次的lambda函数。

最近版本的MSVC应该支持lambda函数,因此应该是这样的:

[](){ /* your compound statement expression here */ }();

编辑:去掉了一个多余的括号

编辑2:为了您的娱乐,这里有一个使用任一变量的示例,其中包含一些(诚然非常愚蠢的)真实代码。不要太在意代码的实际用途,而是它的表现力以及编译器优化得有多好:

#include <string.h>
#include <stdio.h>

int main()
{
    unsigned int a =
        ({
            unsigned int count = 0;
            const char* str = "a silly thing";
            for(unsigned int i = 0; i < strlen(str); ++i)
                count += str[i] == 'i' ? 1 : 0;
            count;
        });

    unsigned int b =
        [](){
            unsigned int count = 0;
            const char* str = "a silly thing";
            for(unsigned int i = 0; i < strlen(str); ++i)
                count += str[i] == 'i' ? 1 : 0;
            return count;
        }();

    printf("Number of 'i' : %u\t%u\n", a, b);

    return 0;
}

...这是gcc 4.5编译的结果:

movl    $2, 8(%esp)
movl    $2, 4(%esp)
movl    $LC0, (%esp)
call    _printf

嘿...这就像Javascript!我知道我可以利用我的JS知识来编写C++!现在我只需要JQuery++!:-) :-) - xanatos
实际上非常酷,你可以使用它来初始化一个变量,整个小程序都可以用它来实现。如果编译器能够证明返回值仅取决于常量,那么它将在编译时完成整个计算,除了丑陋的({})语法外,它也非常具有表现力。这种东西在gcc中已经运行得非常好了很长时间,只不过不幸的是以一种非常非标准的方式。Lambda要优秀得多,因为它是标准的,并允许您提供参数并具有全局访问控制。 - Damon
3
Lambda表达式的缺点是它们无法breakcontinue其所在的循环。 - Johannes Schaub - litb
1
@Andrei:当然可以,这取决于捕获方式。因此,它们不仅可以访问周围的变量,而且可以做得更好。您可以控制可访问的“所有”变量(包括“所有”),以及访问是按值还是按引用进行的,这是一个非常大的优点。例如,&{}()在周围本地访问方面与({})完全相同,但={}()将按值捕获,因此您可以在lambda内部更改值(而不是临时值)而不会污染周围范围。 - Damon
3
要实现类似 Rust 的 try() 宏,你需要能够使用 return - Timmmm
显示剩余4条评论

5
不,它不包含等效表单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接