使用ostream和ostringstream时对运算符优先级的误解

时间:2018-10-07 11:45:01

标签: c++ operator-precedence ostream ostringstream

以下代码具有不同的编译结果。从收到的错误消息中,似乎对运算符优先级()<<感到困惑。我可以通过使用函数轻松解决此问题。但是我想了解并知道:

a)它在哪个编译器上正确评估表达式?对我来说,MSVC2017似乎更合逻辑。

b)是否仍存在使用MACRO的解决方法?

我使用的完整示例代码。

#include <cstdlib>
#include <typeinfo>
#include <sstream>
#include <iostream>

#ifndef NDEBUG
#define  EXPR_INSPECT(param_)\
         ( (std::ostringstream{} << "< " #param_ " [" << typeid(param_).name() << "] > : " << param_).str() )
#else
#define  EXPR_INSPECT(param_)\
         (param_)

#endif //NDEBUG
int main(int argc, char *argv[])
{
   auto        ull_x    {99LLU};
   std::string string_x {"Checking..."};

   std::cout << EXPR_INSPECT(   ull_x) << std::endl;
   std::cout << EXPR_INSPECT(string_x) << std::endl;

   return EXIT_SUCCESS;
}

MSVC2017 完美运行!

G ++ 8.2.0(MSYS2 / MINGW)发出以下 错误:'std :: basic_ostream :: __ ostream_type'{aka'class std :: basic_ostream'}没有名为'str'的成员< / em> 尝试在str()而不是ostream上致电ostringstream

编辑:

这里的问题也可以复制by clang using Wandbox。这是一个最小的示例:

#include <sstream>
#include <iostream>

int main()
{
   auto s = std::ostringstream{};
   decltype(((std::ostringstream{}) << "< "))::nothing;
   decltype((s << "< "))::nothing;
}

在魔盒中,clang发现了第二种类型std::basic_ostream,而第一种是std::basic_ostringstream。真是奇怪。

0 个答案:

没有答案