Dato this test program:Perché questa "chiamata" asserisce di vedere due argomenti invece di uno solo?
#include <cassert>
#include <string>
#include <type_traits>
const std::string& const_string = "bla";
std::string const & string_const = "blabla";
static_assert(std::is_same<decltype(const_string), decltype(string_const)>::value, "Uhoh");
int main()
{
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
}
che afferma che due tipi sono le stesse al momento della compilazione e in fase di esecuzione utilizzando affermare di C. Tutti Clang, MSVC2015, e GCC riportano lo stesso errore, quindi sono abbastanza sicuro it's me:
main.cpp:13:49: error: too many arguments provided to function-like macro invocation
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
^
/usr/include/assert.h:91:10: note: macro 'assert' defined here
# define assert(expr) \
^
Sono solo non vedendo due argomenti nel assert
. Inoltre, lo static_assert
funziona bene ... Quindi cosa sta succedendo qui?
Credo che il preprocessore veda due "confronti"; 'std :: is_same :: value'. Non c'è modo per il preprocessore di dire che non lo sono. –
molbdnilo
** static_assert ** è una parola chiave, ** asserire ** una macro del preprocessore. Le macro preprocessore suddividono gli argomenti con ',' in modo non intelligente. Le parentesi aggiuntive impediscono questo. – Youka