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