Is it possible to construct a compiler that can always identify valid C++ programs in finite time?
Yes. Given enough time and resources a C++ compiler should be able to finish compiling any valid C++ program. A recursively enumerable language requires a turing machine that always terminates and provides a positive answer when the string is in the language, and the compiler does essentially that.
Is it possible to construct a compiler that can always identify invalid C++ programs in finite time?
No. The C++ template language is Turing complete, so you can write an infinite recursion in it. Due to the halting problem, it's impossible to determine whether or not a program will ever finish compiling, thus it's impossible to determine whether the C++ program would ever successfully compile.
I once wrote an infinite recursion in C++ templates and tried to compile with gcc. It turns out that gcc has a configurable recursion depth limit.